在Windows中检测全屏模式

时间:2011-08-10 10:08:32

标签: c++ winapi

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

5 个答案:

答案 0 :(得分:9)

hWnd = GetForegroundWindow();
RECT appBounds;
RECT rc;
GetWindowRect(GetDesktopWindow(), &rc);

然后检查窗口是不是桌面还是shell。 如果说明很简单。

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

这是在没有测试的情况下编写的。

答案 1 :(得分:3)

完整实施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);
}

答案 2 :(得分:3)

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;
}

答案 3 :(得分:0)

这也是基于JNA'答案的Java 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个元素相互比较。

答案 4 :(得分:0)

所有其他答案都是很黑的。

Windows Vista,Windows 7及更高版本支持此功能:

QUERY_USER_NOTIFICATION_STATE pquns;
SHQueryUserNotificationState(&pquns);

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

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