1

基本上,我想将进程 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 和线程 ID CreateProcess,但我仍然不知道如何获取它的 hwnd。我确实读过这个:

调用后CreateProcess(),检查PROCESS_INFORMATION lpProcessInformation 参数指向的结构。 PROCESS_INFORMATION包含刚刚启动的进程的句柄和线程 ID。使用此信息调用 GetGUIThreadInfo()函数,然后检查GUITHREADINFO lpgui 指向的结构。GUITHREADINFO有几个 HWND。从 hwndActive 开始,然后调用GetParent()orGetAncestor()直到找到主窗口。

由 bug_crusher

我试过EnumChildWindows()and EnumWindows(),但它们没有用。

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
    DWORD PID =0;
    GetWindowThreadProcessId(hwnd,&PID);
    if(PID == 1)
    {
        //,,,,,,,,
    }
    return TRUE;
}

但是我不明白,谁能解释一下?

4

1 回答 1

4

我对您实际尝试执行的操作感到有些困惑,但是此函数将构建属于指定进程的所有顶级窗口的向量。

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);
}
于 2013-06-30T04:07:36.470 回答