2012-07-29 20 views
7

Come posso ottenere l'HWND dell'applicazione, se conosco l'ID del processo? Qualcuno potrebbe pubblicare un campione per favore? Sto usando MSV C++ 2010. Ho trovato Process :: MainWindowHandle ma non so come usarlo.Ottieni hwnd per id processo C++

+1

Un processo non è limitato a 1 finestra. – chris

+1

Un processo può avere diverse finestre e questo ha diversi hwnds. –

+0

quindi, maby è possibile ottenere tutti gli HWND e selezionarli, con questo ID di processo? – Luke

risposta

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

Questo funziona per me come il formaggio .. – Nadun

+1

Uno deve indicare che 'PID' deve appartenere allo stesso desktop (o utente interattivo/sessione di accesso) come il processo da cui viene chiamato questo metodo. Altrimenti 'EnumWindows' non enumera l'handle della finestra. Ad esempio, non è possibile utilizzare questo metodo da un servizio o se il processo in questione viene eseguito con un account utente connesso diverso oppure recuperare HWND per uno screensaver se la workstation è bloccata, ecc. – c00000fd

+0

Basta convertire questo codice in libero pascal e funziona come formaggio anche per me :) – Jako

3

È possibile utilizzare le funzioni EnumWindows e GetWindowThreadProcessId() come indicato in questo MSDN article.

0

Un singolo PID (ID processo) può essere associato a più finestre (HWND). Ad esempio se l'applicazione utilizza più finestre.
Il seguente codice individua i punti di manipolazione di tutte le finestre per un dato PID.

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); 
} 
Problemi correlati