Jump to content


Photo

Obtener el Window Handle de un Proceso?


  • Please log in to reply
3 replies to this topic

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 10 March 2010 - 08:13 AM

Bueno ocurre que tengo una aplicacion que no tiene Caption... o titulo en si... lo cual no puedo usar



delphi
  1. WHandle := FindWindow(nil, 'Caption');



Ahora ocurre que si se la clase pero si en una PC o cliente X hay una clase similar... e ahi un problemita...

Lo que quiero es obtener el Window Handle de un Proceso cualquiera..

Sabiendo el nombre del proceso.. obtener el Handle .. se que para un proces existe X Windows Handle pero para un Window Handle solo existe un proceso...

Como puedo obtener la solucion?

Gracias

  • 0

#2 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 10 March 2010 - 08:28 AM

Ahora indagando un poco mas... y analizando mas..

Encontre una web china o koreana..

http://www.delphitop...ncheng/219.html
http://delphi.ktop.c...id=79&tid=61654


Program Name、Process ID、Window Handle、Process Handle

TerminateProcess=> Process Handle
PostMessage,SendMessage=> Window Handle



delphi
  1. // Get ProcessID By ProgramName (Include Path or Not Include)
  2. function GetPIDByProgramName(const APName: string): THandle;
  3. // Get Window Handle By ProgramName (Include Path or Not Include)
  4. function GetHWndByProgramName(const APName: string): THandle;
  5. // Get Window Handle By ProcessID
  6. function GetHWndByPID(const hPID: THandle): THandle;
  7. // Get ProcessID By Window Handle
  8. function GetPIDByHWnd(const hWnd: THandle): THandle;
  9. // Get Process Handle By Window Handle
  10. function GetProcessHndByHWnd(const hWnd: THandle): THandle;
  11. // Get Process Handle By Process ID
  12. function GetProcessHndByPID(const hAPID: THandle): THandle;




Ahora cual es el que corresponde correctamente al handle devuelto por FindWindow
Process Handle o Window Handle
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 10 March 2010 - 09:51 AM

Hola c0lo, hacía tiempo que no pasabas por aquí. :)

En primer lugar, he de decirte que por el nombre del proceso puedes encontrar mas de uno, es decir, pueden correr mas de una instancia de un proceso o procesos con nombres similares. Deberás saber cual es el que te interesa. Mejor sería conociendo el Pid del proceso que te interesa, pues es un identificador único.

Para conseguir lo que quieres sabiendo sólo el nombre de un proceso, primero debes buscar el Pid del proceso. En el ejemplo nos conformamos con el primero que encontremos. Después enumeramos todas las ventanas hasta encontrar una que pertenezca al proceso en cuestión y de esta calculamos su parent último:



cpp
  1. struct WINDATA{
  2.   HWND  hWin;
  3.   DWORD ProcessId;
  4. };
  5.  
  6. BOOL CALLBACK EnumWindowsProc(HANDLE Handle, WINDATA* Data)
  7. {
  8.   DWORD ProcessId;
  9.   GetWindowThreadProcessId(Handle, &ProcessId);
  10.   if(Data->ProcessId == ProcessId){
  11.     Data->hWin = Handle;
  12.     return false;
  13.   }
  14.   return true;
  15. }
  16.  
  17. HWND GetWindow(char* FileName)
  18. {
  19.   // Encontrar una ventana del proceso
  20.   WINDATA Data = {0};
  21.   PROCESSENTRY32 proc = { sizeof(proc) };
  22.   HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  23.   if(hSysSnapshot != INVALID_HANDLE_VALUE && Process32First(hSysSnapshot, &proc)){
  24.     do{
  25.         if(!stricmp(proc.szExeFile, FileName)){
  26.           Data.ProcessId = proc.th32ProcessID;
  27.           EnumWindows((PROC)EnumWindowsProc, LPARAM(&Data));
  28.           break;
  29.         }
  30.     }while(Process32Next(hSysSnapshot, &proc));
  31.   }
  32.   CloseHandle(hSysSnapshot);
  33.  
  34.   // Encontar MainWindow
  35.   HWND hParent = Data.hWin;
  36.   do {
  37.       Data.hWin = hParent;
  38.       hParent = GetParent(Data.hWin);
  39.   }while(hParent);
  40.  
  41.   return Data.hWin;
  42. }



Ejemplo de uso:



cpp
  1.  
  2. HWND hW = GetWindow("Notepad.exe");



Espero que te aclare las ideas.

Saludos.
  • 0

#4 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 posts
  • LocationLima-Peru

Posted 10 March 2010 - 09:55 AM

Muchas gracias escafandra y si ya me despejastes mis dudas amigo :D
  • 0




IP.Board spam blocked by CleanTalk.