2012-07-29 50 views
7

¿Cómo puedo obtener la aplicación HWND, si conozco la ID del proceso? ¿Alguien podría publicar una muestra, por favor? Estoy usando MSV C++ 2010. Encontré Process :: MainWindowHandle pero no sé cómo usarlo.Obtener hwnd por identificación del proceso C++

+1

Un proceso no está limitado a 1 ventana. – chris

+1

Un proceso puede tener varias ventanas, y esto tiene varios hwnds. –

+0

Entonces, ¿es posible obtener todos los HWND y seleccionarlos, que tienen este ID de proceso? – Luke

Respuesta

16
HWND g_HWND=NULL; 
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam) 
{ 
    DWORD lpdwProcessId; 
    GetWindowThreadProcessId(hwnd,&lpdwProcessId); 
    if(lpdwProcessId==lParam) 
    { 
     g_HWND=hwnd; 
     return FALSE; 
    } 
    return TRUE; 
} 
EnumWindows(EnumWindowsProcMy,m_ProcessId); 
+1

Esto funciona para mí como el queso .. – Nadun

+1

Es necesario señalar que 'PID' debe pertenecer al mismo escritorio (o sesión de usuario/inicio de sesión interactivo) como el proceso al que llama este método. De lo contrario, 'EnumWindows' no enumerará su identificador de ventana. Por ejemplo, no puede usar este método desde un servicio, o si el proceso en cuestión se ejecuta bajo una cuenta de usuario diferente, o recuperar el HWND para un protector de pantalla si la estación de trabajo está bloqueada, etc. – c00000fd

+0

Acaba de convertir este código gratis Pascal y funciona como queso para mí también :) – Jako

0

Un único PID (ID de proceso) se puede asociar con más de una ventana (HWND). Por ejemplo, si la aplicación está usando varias ventanas.
El siguiente código ubica los identificadores de todas las ventanas por un PID dado.

void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds) 
{ 
    // find all hWnds (vhWnds) associated with a process id (dwProcessID) 
    HWND hCurWnd = NULL; 
    do 
    { 
     hCurWnd = FindWindowEx(NULL, hCurWnd, NULL, NULL); 
     DWORD dwProcessID = 0; 
     GetWindowThreadProcessId(hCurWnd, &dwProcessID); 
     if (dwProcessID == dwProcessID) 
     { 
      vhWnds.push_back(hCurWnd); // add the found hCurWnd to the vector 
      wprintf(L"Found hWnd %d\n", hCurWnd); 
     } 
    } 
    while (hCurWnd != NULL); 
} 
Cuestiones relacionadas