如何获取给定监视器上所有窗口的HWND?

时间:2018-08-25 17:54:11

标签: c++ winapi

GetDesktopWindow()仅返回主桌面。我也尝试过EnumDisplayMonitors(),但这不会返回桌面句柄。

2 个答案:

答案 0 :(得分:4)

您可以使用可用功能执行以下操作:

方法1(对于与监视器边界重叠的窗口不太准确)

  1. 枚举所有窗口(EnumWindows()
  2. 使用MonitorFromWindow()忽略不在监视器上的不在您关心的监视器上。

方法2(更准确)

  1. 获取您关心的监视器的范围(GetMonitorInfo()函数)
  2. 枚举所有窗口(EnumWindows()
  3. 检查每个窗口的轮廓矩形(对于XP,为GetWindowRect(),否则为DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS)),以查看其是否与监视器矩形相交(IntersectRect())。

答案 1 :(得分:3)

您可以使用EnumWindows函数,然后检查该窗口是否属于特定的监视器:

BOOL CALLBACK EnumWindowsProc(_In_ HWND hwnd, _In_ LPARAM lParam) noexcept
{
    auto const h_monitor{::MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL)};
    if(h_monitor == g_h_target_minitor)
    {
        // Do something...
    }
    return TRUE;
}