通过进程id c ++获取hwnd

Luk*_*uke 9 c++ pid get hwnd

如果我知道进程ID,我怎样才能获得应用程序的HWND?有人可以发一个样品吗?我正在使用MSV C++ 2010.我找到了Process :: MainWindowHandle,但我不知道如何使用它.

小智 21

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);
Run Code Online (Sandbox Code Playgroud)

  • 需要指出的是,`PID` 必须与您从中调用此方法的进程属于同一桌面(或交互式用户/登录会话)。否则`EnumWindows` 不会枚举它的窗口句柄。例如,您不能从服务使用此方法,或者如果有问题的进程在不同的登录用户帐户下运行,或者如果工作站被锁定,则无法检索屏幕保护程序的 HWND 等。 (2认同)

Mic*_*ati 8

一个 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 dwProcID = 0;
        GetWindowThreadProcessId(hCurWnd, &dwProcID);
        if (dwProcID == dwProcessID)
        {
            vhWnds.push_back(hCurWnd);  // add the found hCurWnd to the vector
            wprintf(L"Found hWnd %d\n", hCurWnd);
        }
    }
    while (hCurWnd != NULL);
}
Run Code Online (Sandbox Code Playgroud)