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++
risposta
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);
Questo funziona per me come il formaggio .. – Nadun
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
Basta convertire questo codice in libero pascal e funziona come formaggio anche per me :) – Jako
È possibile utilizzare le funzioni EnumWindows e GetWindowThreadProcessId() come indicato in questo MSDN article.
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);
}
Un processo non è limitato a 1 finestra. – chris
Un processo può avere diverse finestre e questo ha diversi hwnds. –
quindi, maby è possibile ottenere tutti gli HWND e selezionarli, con questo ID di processo? – Luke