【问题标题】:Get hwnd by process id c++通过进程 id c++ 获取 hwnd
【发布时间】:2012-07-27 12:37:15
【问题描述】:

如果我知道进程 ID,如何获取应用程序的 HWND?任何人都可以张贴样品吗?我正在使用 MSV C++ 2010。 我找到了 Process::MainWindowHandle 但我不知道如何使用它。

【问题讨论】:

  • 一个进程不限于1个窗口。
  • 一个进程可以有多个窗口,而这有几个 hwnd。
  • 那么,也许有可能获取所有 HWND 并选择这些,有这个进程 ID 吗?
  • Process::MainWindowHandle 有什么问题?这不是你要找的吗?

标签: c++ get pid hwnd


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感谢Michael Haephrati,我稍微更正了您针对现代 Qt C++ 11 的代码:

    #include <iostream>
    #include "windows.h"
    #include "tlhelp32.h"
    #include "tchar.h"
    #include "vector"
    #include "string"
    
    using namespace std;
    
    void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds)
    {
        // find all hWnds (vhWnds) associated with a process id (dwProcessID)
        HWND hCurWnd = nullptr;
        do
        {
            hCurWnd = FindWindowEx(nullptr, hCurWnd, nullptr, nullptr);
            DWORD checkProcessID = 0;
            GetWindowThreadProcessId(hCurWnd, &checkProcessID);
            if (checkProcessID == dwProcessID)
            {
                vhWnds.push_back(hCurWnd);  // add the found hCurWnd to the vector
                //wprintf(L"Found hWnd %d\n", hCurWnd);
            }
        }
        while (hCurWnd != nullptr);
    }
    

    【讨论】:

      【解决方案3】:
      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);
      

      【讨论】:

      • 需要指出PID 必须与您调用此方法的进程属于同一个桌面(或交互式用户/登录会话)。否则EnumWindows 将不会枚举其窗口句柄。例如,您不能从服务中使用此方法,或者如果相关进程在不同的登录用户帐户下运行,或者如果工作站被锁定,则无法检索 HWND 以获取屏幕保护程序,等等。
      • 刚刚将此代码转换为免费帕斯卡,对我来说也像奶酪一样工作:)
      【解决方案4】:

      您可以使用 MSDN article 中提到的 EnumWindows 和 GetWindowThreadProcessId() 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-14
        • 1970-01-01
        • 2014-06-27
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多