Мне нужно определить, запущено ли какое-либо приложение в полноэкранном режиме. Если да, то я должен остановить свою заявку. Итак, как я могу это обнаружить? PS Win32 C++
Обнаружение полноэкранного режима в Windows
Ответ 1
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
}
Это написано без тестирования.
Ответ 2
Полная реализация ответа 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);
}
Ответ 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;
}
Ответ 4
Вот также реализация 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 элемента друг с другом.