Как получить HWND всех окон, присутствующих на данном мониторе? - PullRequest
0 голосов
/ 25 августа 2018

GetDesktopWindow() возвращает только основной рабочий стол.Я также пробовал EnumDisplayMonitors(), но это не возвращает дескриптор рабочего стола.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы можете сделать это, используя доступные функции, а именно:

Метод 1 (менее точен для окон, перекрывающих границу монитора)

  1. Перечислить все окна (EnumWindows())
  2. Используйте MonitorFromWindow(), чтобы игнорировать те, которые отсутствуют на мониторе находятся на мониторе, отличном от того, который вам нужен.

Метод 2 (точнее)

  1. Получите границы нужного вам монитора (функция GetMonitorInfo())
  2. Перечислить все окна (EnumWindows())
  3. Проверьте контурный прямоугольник каждого окна (GetWindowRect() для XP, в противном случае DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS)), чтобы увидеть, пересекается ли он (IntersectRect()) с прямоугольником монитора.
0 голосов
/ 25 августа 2018

Вы можете использовать функцию 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...