将PID转换为HWND

时间:2013-06-30 03:38:04

标签: c++ winapi process

基本上,我想将进程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创建的流程。在这种情况下我该怎么办?我有来自CreateProcess的进程信息,例如它的ID和线程ID,但我仍然不知道如何获取它的hwnd。我读过这个:

  

致电CreateProcess()后,请检查PROCESS_INFORMATION   struct指向lpProcessInformation参数。   PROCESS_INFORMATION包含您刚才的流程句柄   启动和一个线程ID。有了这个信息,请致电   GetGUIThreadInfo()功能,然后检查GUITHREADINFO   lpgui指向的struct。 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;
}

但是我没理解,有人可以解释一下吗?

1 个答案:

答案 0 :(得分:3)

我对你实际尝试的内容感到有点困惑,但是这个函数会构建一个属于指定进程的所有顶级窗口的向量。

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);
}