From 0be120d2932a4aa182e86f25cd13e76ea03c7d2b Mon Sep 17 00:00:00 2001 From: Ani Betts Date: Wed, 17 Jan 2024 11:26:28 +0100 Subject: [PATCH] [PTRun]Detect full-screen games with QUNS_RUNNING_D3D_FULL_SCREEN (#30797) * Add SHQueryUserNotificationState to NativeMethods * Check for QUNS_RUNNING_D3D_FULL_SCREEN in IsWindowFullscreen The current test for whether a window is full-screen (i.e. a movie or a game) is a bit of a heuristic. In certain cases however, we can *know* that a window is full-screen. Check that case first, then proceed with the existing logic * Make spellchecker happier --- .../launcher/PowerLauncher/Helper/NativeMethods.cs | 14 ++++++++++++++ .../PowerLauncher/Helper/WindowsInteropHelper.cs | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/src/modules/launcher/PowerLauncher/Helper/NativeMethods.cs b/src/modules/launcher/PowerLauncher/Helper/NativeMethods.cs index c6dd2c33ad..5e6ff90c95 100644 --- a/src/modules/launcher/PowerLauncher/Helper/NativeMethods.cs +++ b/src/modules/launcher/PowerLauncher/Helper/NativeMethods.cs @@ -69,6 +69,9 @@ namespace PowerLauncher.Helper [DllImport("user32.DLL", CharSet = CharSet.Unicode)] internal static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); + [DllImport("shell32.dll")] + public static extern int SHQueryUserNotificationState(out UserNotificationState state); + public static string[] CommandLineToArgvW(string cmdLine) { IntPtr argv = IntPtr.Zero; @@ -242,4 +245,15 @@ namespace PowerLauncher.Helper TRAYMOUSEMESSAGE = 0x800, // WM_USER + 1024 APP = 0x8000, } + + internal enum UserNotificationState : int + { + QUNS_NOT_PRESENT = 1, + QUNS_BUSY, + QUNS_RUNNING_D3D_FULL_SCREEN, + QUNS_PRESENTATION_MODE, + QUNS_ACCEPTS_NOTIFICATIONS, + QUNS_QUIET_TIME, + QUNS_APP, + } } diff --git a/src/modules/launcher/PowerLauncher/Helper/WindowsInteropHelper.cs b/src/modules/launcher/PowerLauncher/Helper/WindowsInteropHelper.cs index 4c0819f203..612476daff 100644 --- a/src/modules/launcher/PowerLauncher/Helper/WindowsInteropHelper.cs +++ b/src/modules/launcher/PowerLauncher/Helper/WindowsInteropHelper.cs @@ -112,6 +112,15 @@ namespace PowerLauncher.Helper public static bool IsWindowFullscreen() { + // First, check to see if a game is fullscreen, if so, we definitely have + // a full-screen window + UserNotificationState state; + if (Marshal.GetExceptionForHR(NativeMethods.SHQueryUserNotificationState(out state)) == null && + state == UserNotificationState.QUNS_RUNNING_D3D_FULL_SCREEN) + { + return true; + } + // get current active window IntPtr hWnd = NativeMethods.GetForegroundWindow();