[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
This commit is contained in:
Ani Betts 2024-01-17 11:26:28 +01:00 committed by GitHub
parent 6522079736
commit 0be120d293
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 0 deletions

View File

@ -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,
}
}

View File

@ -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();