将PID转换为HWND

Convert PID to HWND

本文关键字:HWND 转换 PID      更新时间:2023-10-16

基本上,我想将进程ID转换为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创建的进程之前,这一直很好。这种情况下我该怎么办?我有进程信息,比如它的ID和来自CreateProcess的线程ID,但我仍然不知道如何获得它的hwnd。我确实读过这个:

调用CreateProcess()后,检查PROCESS_INFORMATIONlpProcessInformation参数指向的结构。PROCESS_INFORMATION包含一个您刚刚started和线程ID。使用此信息调用GetGUIThreadInfo()函数,然后检查GUITHREADINFOlpgui指向的结构。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;
}

但我不明白,有人能解释一下吗?

我对您实际想要做的事情有点困惑,但这个函数将构建属于指定进程的所有顶级窗口的向量。

void GetWindowsOfProcess(DWORD dwId, std::vector<HWND>& vecWindows)
{
    struct WindowsOfProcess
    {
        std::vector<HWND>*  pvecWindows;
        DWORD               dwProcId;
        static BOOL CALLBACK EnumProc(HWND hWnd, LPARAM lParam)
        {
            DWORD dwProcId;
            GetWindowThreadProcessId(hWnd, &dwProcId);
            if (dwProcId == reinterpret_cast<WindowsOfProcess*>(lParam)->dwProcId)
                reinterpret_cast<WindowsOfProcess*>(lParam)->pvecWindows->push_back(hWnd);
            return TRUE;
        }
        WindowsOfProcess(DWORD dwId, std::vector<HWND>* pvec)
            :   dwProcId(dwId)
            ,   pvecWindows(pvec)
        {
            EnumWindows(EnumProc, reinterpret_cast<LPARAM>(this));
        }
    };
    WindowsOfProcess wop(dwId, &vecWindows);
}