2012-07-29 179 views
7

如何獲得應用程序的HWND,如果我知道進程ID?任何人都可以發佈樣品嗎?我正在使用MSV C++ 2010. 我找到了Process :: MainWindowHandle,但我不知道如何使用它。通過進程ID獲取hwnd C++

+1

的方法並不限定於1個窗口。 – chris 2012-07-29 17:37:11

+1

一個進程可以有幾個窗口,這有幾個hwnds。 – 2012-07-29 17:37:18

+0

因此,馬比是否有可能獲得所有HWND並選擇這些,這個進程ID有什麼? – Luke 2012-07-29 17:41:36

回答

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

這對我來說就像奶酪一樣。 – Nadun 2014-05-02 11:22:19

+1

需要指出的是,'PID'必須屬於同一個桌面(或交互式用戶/登錄會話),就像您調用此方法的過程一樣。否則'EnumWindows'不會枚舉它的窗口句柄。例如,您不能在服務中使用此方法,或者如果所討論的進程在不同的登錄用戶帳戶下運行,或者在工作站被鎖定等情況下檢索屏幕保護程序的HWND等。 – c00000fd 2015-06-10 20:40:38

+0

只需在free中轉換此代碼帕斯卡和我的作品像奶酪一樣:) – Jako 2015-11-10 15:41:13

0

單個PID(進程ID)可以與多個窗口(HWND)相關聯。例如,如果應用程序使用多個窗口。
以下代碼將查找給定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); 
}