Обнаружение полноэкранного режима в Windows - PullRequest
13 голосов
/ 10 августа 2011

Мне нужно определить, запущено ли какое-либо приложение в полноэкранном режиме. Если да, то я должен остановить свою заявку. Итак, как я могу это обнаружить? постскриптум Win32 C ++

Ответы [ 4 ]

9 голосов
/ 10 августа 2011
hWnd = GetForegroundWindow();
RECT appBounds;
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);

Затем проверьте, не являются ли эти окна рабочим столом или оболочкой. Простая инструкция.

if(hWnd =! GetDesktopWindow() && hWnd != GetShellWindow())
{
    GetWindowRect(hWnd, &appBounds);
    // Now you just have to compare rc to appBounds
}

Это написано без тестирования.

3 голосов
/ 05 апреля 2019

Ответы Хуча и Энса на самом деле не работают в системе с несколькими мониторами. Это потому что

Прямоугольник окна рабочего стола, возвращаемый GetWindowRect или GetClientRect, всегда равен прямоугольнику основного монитора для совместимости с существующими приложениями.

См. https://docs.microsoft.com/en-us/windows/desktop/gdi/multiple-monitor-system-metrics для справки.

Вышеуказанное означает, что если окно является полноэкранным на мониторе, который не является основным монитором системы, координаты (относительно виртуального экрана) полностью отличаются от координат окна рабочего стола.

Я исправил это с помощью следующей функции:

bool isFullscreen(HWND windowHandle)
{
    MONITORINFO monitorInfo = { 0 };
    monitorInfo.cbSize = sizeof(MONITORINFO);
    GetMonitorInfo(MonitorFromWindow(windowHandle, MONITOR_DEFAULTTOPRIMARY), &monitorInfo);

    RECT windowRect;
    GetWindowRect(windowHandle, &windowRect);

    return windowRect.left == monitorInfo.rcMonitor.left
        && windowRect.right == monitorInfo.rcMonitor.right
        && windowRect.top == monitorInfo.rcMonitor.top
        && windowRect.bottom == monitorInfo.rcMonitor.bottom;
}
3 голосов
/ 04 июля 2017

Полная реализация ответа Хуча:

bool isFullscreen(HWND window)
{
    RECT a, b;
    GetWindowRect(window, &a);
    GetWindowRect(GetDesktopWindow(), &b);
    return (a.left   == b.left  &&
            a.top    == b.top   &&
            a.right  == b.right &&
            a.bottom == b.bottom);
}
0 голосов
/ 11 августа 2018

Вот также реализация Java JNA на основе ответа ens ':

public static boolean isFullScreen()
{
    WinDef.HWND foregroundWindow = GetForegroundWindow();
    WinDef.RECT foregroundRectangle = new WinDef.RECT();
    WinDef.RECT desktopWindowRectangle = new WinDef.RECT();
    User32.INSTANCE.GetWindowRect(foregroundWindow, foregroundRectangle);
    WinDef.HWND desktopWindow = User32.INSTANCE.GetDesktopWindow();
    User32.INSTANCE.GetWindowRect(desktopWindow, desktopWindowRectangle);
    return foregroundRectangle.toString().equals(desktopWindowRectangle.toString());
}

Обратите внимание, что сравнение toString() внизунебольшой взлом, чтобы не сравнивать 4 элемента друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...