2012-07-29 141 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); 
}