【问题标题】:Convert PID to HWND将 PID 转换为 HWND
【发布时间】:2013-06-30 03:38:04
【问题描述】:

基本上,我想将进程 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 lpProcessInformation 参数指向的结构。 PROCESS_INFORMATION 包含您刚刚处理的进程的句柄 开始和线程 ID。有了这些信息,请致电 GetGUIThreadInfo()function 然后检查GUITHREADINFO lpgui 指向的结构。 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;
}

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

【问题讨论】:

  • 一个进程可以没有、一个或多个窗口,没有所谓的“进程的 hwnd”。 EnumWindows 并为每个人致电 GetWindowThreadProcessId
  • 它不起作用,即使使用 EnumWindows()
  • 什么不起作用?您需要更具体地说明您尝试过的内容、预期的结果以及观察到的结果。
  • if(PID == 1) 我可以得到任何 hwnd,除了由 createprocess 创建的那个,我不知道为什么///
  • CreateProcess 不创建窗口,它创建进程。

标签: c++ winapi process


【解决方案1】:

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

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

【讨论】:

  • 感谢代码,但我想我找到了一种方法,除非我有 2 个应用程序具有相同的名称 test.exe 并且我使用了 finiwindow,我怎样才能找到第二个 text.exe?这可能吗?
猜你喜欢
  • 2012-12-29
  • 2011-05-03
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多