Ir al contenido


Foto

[MULTILENGUAJE] Obtener Handle, Caption y Nombre de clase de una ventana conociendo PID


  • Por favor identifícate para responder
4 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 enero 2011 - 08:03

...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
  1. function GetWindowFromPId(PId: DWORD; var WText, WClass: String): THandle;
  2. type
  3.   TWinParam = record
  4.     Handle: THandle;
  5.     PId: DWORD;
  6.   end;
  7.   PWinParam = ^TWinParam;
  8. var
  9.   WinParam: TWinParam;
  10.   Buffer: array [1..255] of char;
  11.  
  12.   function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall;
  13.   var
  14.     PId: DWORD;
  15.   begin
  16.     Result:= true;
  17.     PId:= 0;
  18.     GetWindowThreadProcessId(Handle, PId);
  19.     if PWinParam(lParam).PId = PId then
  20.     begin
  21.       PWinParam(lParam).Handle:= Handle;
  22.       Result:= false;
  23.     end;
  24.   end;
  25.  
  26. begin
  27.   WinParam.PId:= PId;
  28.   EnumWindows(@EnumWindowsProc, LPARAM(@WinParam));
  29.   repeat
  30.     Result:= WinParam.Handle;
  31.     WinParam.Handle:= Windows.GetParent(Result);
  32.   until WinParam.Handle = 0;
  33.   GetWindowText(Result, @Buffer, 255);
  34.   WText:= Buffer;
  35.   GetClassName(Result, @Buffer, 255);
  36.   WClass:= Buffer;
  37. end;



Ejemplo de uso:


delphi
  1. var
  2.   Caption: String;
  3.   Clase: String;
  4.   HWin: THandle;
  5. begin
  6.   HWin:= GetWindowFromPId(PID, Caption, Clase);
  7. end;



C/C++:


cpp
  1. HWND GetWindowFromPId(DWORD PId, String &WText, String &WClass)
  2. {
  3.   typedef BOOL (__stdcall *TP)();
  4.   struct TWinParam{
  5.     HWND  Handle;
  6.     DWORD PId;
  7.     static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam){
  8.       DWORD PId = 0;
  9.       GetWindowThreadProcessId(hWnd, &PId);
  10.       if(((TWinParam*)lParam)->PId == PId){
  11.         ((TWinParam*)lParam)->Handle = hWnd;
  12.         return false;
  13.       }
  14.       return true;
  15.     }
  16.   } WinParam;
  17.  
  18.   char Buffer[255];
  19.   WinParam.PId = PId;
  20.   HWND Result;
  21.  
  22.   EnumWindows((TP)TWinParam::EnumWindowsProc, LPARAM(&WinParam));
  23.   do{
  24.     Result = WinParam.Handle;
  25.     WinParam.Handle = GetParent(Result);
  26.   } while(WinParam.Handle);
  27.   GetWindowText(Result, Buffer, 255);
  28.   WText = Buffer;
  29.   GetClassName(Result, Buffer, 255);
  30.   WClass = Buffer;
  31.   return Result;
  32. }



Elemplo:


cpp
  1.   String Caption;
  2.   String Clase;
  3.   HWND hWin;
  4.  
  5.   hWin = GetWindowFromPId(PID, Caption, Clase);





Saludos.
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 21 enero 2011 - 08:09

Es curioso como se parece nuestro código  :|
http://delphi.jmrds.com/?q=node/38
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 enero 2011 - 08:19

Es curioso como se parece nuestro código  :|
http://delphi.jmrds.com/?q=node/38


Si... Supongo que no hay muchas formas de abordar esta cuestión.  :)

Saludos.




  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 21 enero 2011 - 08:21

Si... Supongo que no hay muchas formas de abordar esta cuestión.  :)


Las grandes mentes pensamos igual  (h) :D :D :D
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 enero 2011 - 09:25

Las grandes mentes pensamos igual  (h) :D :D :D


¿Grandes mentes?  ^o|  :D :D :D


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.