在Windows中检测全屏模式

leb*_*323 13 c++ winapi

如果某些应用程序当前以全屏模式运行,我需要检测.如果是,那么我必须停止我的申请.那我怎么能发现呢?ps Win32 C++

And*_*eev 10

所有其他答案都相当骇人听闻。

Windows Vista、Windows 7 及更高版本支持:

QUERY_USER_NOTIFICATION_STATE pquns;
SHQueryUserNotificationState(&pquns);

Run Code Online (Sandbox Code Playgroud)

QUNS_BUSYQUNS_RUNNING_D3D_FULL_SCREEN指示正在运行的全屏应用程序(F11 或视频游戏全屏,而不是最大化窗口)。我尝试仅QUNS_BUSY在 Windows 10 上使用的电子游戏,我无法触发QUNS_RUNNING_D3D_FULL_SCREEN.

QUNS_PRESENTATION_MODE 表示一种特殊的 Windows 模式,用于在投影仪上显示演示文稿,也是有效的全屏模式。


Hoo*_*och 9

hWnd = GetForegroundWindow();
RECT appBounds;
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);
Run Code Online (Sandbox Code Playgroud)

然后检查该窗口是不是桌面还是shell.简单的指令.

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

这是没有测试的.


小智 6

Hooch 和 ens 的答案实际上不适用于多监视器系统。那是因为

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;
}
Run Code Online (Sandbox Code Playgroud)


ens*_*ens 5

Hooch 答案的完整实现:

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);
}
Run Code Online (Sandbox Code Playgroud)