...quiero saber como puedo obtener la clase y el caption de una aplicación conociendo unicamente el proceso...
Para conocer el Handle de una ventana conociendo el Pid del proceso, debemos enumerar todas las ventanas y comprobar si el PID de sus respectivos procesos corresponden con el dado. Conociendo el Handle podemos conocer el resto de los datos pedidos.
Tenemos que tener en cuenta, que no todos los procesos tienen una ventana asociada y que la ventana encontrada puede no ser la principal. Para encontrar la ventana principal, navegaremos en sentido ascendente buscando Parents hasta el nivel mas alto. Aquí tenemos otra limitación pues encontraremos ese nivel, pero no tiene porqué ser la ventana principal de la aplicación.
El código que propongo para aproximarnos al problema, que va a ser eficaz en gran parte de los casos es el siguiente:
Delphi:
delphi
function GetWindowFromPId(PId: DWORD; var WText, WClass: String): THandle; type TWinParam = record Handle: THandle; PId: DWORD; end; PWinParam = ^TWinParam; var WinParam: TWinParam; Buffer: array [1..255] of char; function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall; var PId: DWORD; begin Result:= true; PId:= 0; GetWindowThreadProcessId(Handle, PId); if PWinParam(lParam).PId = PId then begin PWinParam(lParam).Handle:= Handle; Result:= false; end; end; begin WinParam.PId:= PId; EnumWindows(@EnumWindowsProc, LPARAM(@WinParam)); repeat Result:= WinParam.Handle; WinParam.Handle:= Windows.GetParent(Result); until WinParam.Handle = 0; GetWindowText(Result, @Buffer, 255); WText:= Buffer; GetClassName(Result, @Buffer, 255); WClass:= Buffer; end;
Ejemplo de uso:
delphi
var Caption: String; Clase: String; HWin: THandle; begin HWin:= GetWindowFromPId(PID, Caption, Clase); end;
C/C++:
cpp
HWND GetWindowFromPId(DWORD PId, String &WText, String &WClass) { typedef BOOL (__stdcall *TP)(); struct TWinParam{ HWND Handle; DWORD PId; static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){ DWORD PId = 0; GetWindowThreadProcessId(hWnd, &PId); if(((TWinParam*)lParam)->PId == PId){ ((TWinParam*)lParam)->Handle = hWnd; return false; } return true; } } WinParam; char Buffer[255]; WinParam.PId = PId; HWND Result; EnumWindows((TP)TWinParam::EnumWindowsProc, LPARAM(&WinParam)); do{ Result = WinParam.Handle; WinParam.Handle = GetParent(Result); } while(WinParam.Handle); GetWindowText(Result, Buffer, 255); WText = Buffer; GetClassName(Result, Buffer, 255); WClass = Buffer; return Result; }
Elemplo:
cpp
String Caption; String Clase; HWND hWin; hWin = GetWindowFromPId(PID, Caption, Clase);
Saludos.