基本上,我想將進程ID轉換爲HWND。我使用此代碼:將PID轉換爲HWND
DWORD dwWindowId;
CHAR pszClassName[200];
HWND hWnd;
hWnd = GetTopWindow (NULL);
while (hWnd != NULL)
{
if (GetClassName (hWnd, pszClassName, 200) > 0)
if (lstrcmpiA (lpcszWindowClass, pszClassName) == 0)
if (GetWindowThreadProcessId (hWnd, &dwWindowId))
if (dwWindowId == dwProcessId)
return hWnd;
hWnd = GetNextWindow (hWnd, GW_HWNDNEXT);
}
return NULL;
這工作得很好,直到我試圖用一個進程被CreateProcess
創建。在這種情況下我該怎麼辦?我有流程信息,例如CreateProcess
的ID和線程ID,但我仍然不知道如何獲取它的hwnd。我看過這樣的:
你叫
CreateProcess()
後,檢查PROCESS_INFORMATION
結構由lpProcessInformation參數指向。PROCESS_INFORMATION
包含一個處理程序,你只需要 開始和一個線程ID。通過此信息調用GetGUIThreadInfo()
函數,然後檢查由lpgui指向的結構體。GUITHREADINFO
有幾個HWND。使用hwndActive啓動 ,並致電GetParent()
或GetAncestor()
直至找到主窗口 。通過bug_crusher
我試圖EnumChildWindows()
和EnumWindows()
,他們沒有工作。
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
DWORD PID =0;
GetWindowThreadProcessId(hwnd,&PID);
if(PID == 1)
{
//,,,,,,,,
}
return TRUE;
}
但我不明白,任何人都可以解釋嗎?
進程可以沒有,一個或多個窗口,沒有「進程的hwnd」這樣的事情。 'EnumWindows'併爲每一個調用'GetWindowThreadProcessId'。 –
它不起作用,即使使用EnumWindows() –
什麼是行不通的?您需要更具體地瞭解您嘗試的內容,您期望得到的結果以及您觀察到的結果。 –