From edc9dbf77ff1bc300672d2237aa113b22f0145d6 Mon Sep 17 00:00:00 2001 From: Serge <5920850+seerge@users.noreply.github.com> Date: Thu, 13 Jul 2023 15:02:33 +0200 Subject: [PATCH] Improved Screen detection --- app/Display/ScreenControl.cs | 27 ++++++++------ app/Display/ScreenNative.cs | 70 ++++++++++++++++++------------------ app/Settings.cs | 2 +- 3 files changed, 53 insertions(+), 46 deletions(-) diff --git a/app/Display/ScreenControl.cs b/app/Display/ScreenControl.cs index 4e2b9708..3bc98323 100644 --- a/app/Display/ScreenControl.cs +++ b/app/Display/ScreenControl.cs @@ -4,12 +4,15 @@ namespace GHelper.Display { public class ScreenControl { + + public const int MAX_REFRESH = 1000; + public void AutoScreen(bool force = false) { if (force || AppConfig.Is("screen_auto")) { if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online) - SetScreen(1000, 1); + SetScreen(MAX_REFRESH, 1); else SetScreen(60, 0); } @@ -22,20 +25,19 @@ namespace GHelper.Display public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1) { - if (ScreenNative.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate - { - InitScreen(); - return; - } + var laptopScreen = ScreenNative.FindLaptopScreen(true); + if (laptopScreen is null) return; - if (frequency >= 1000) + if (ScreenNative.GetRefreshRate(laptopScreen) < 0) return; + + if (frequency >= MAX_REFRESH) { - frequency = ScreenNative.GetRefreshRate(true); + frequency = ScreenNative.GetMaxRefreshRate(laptopScreen); } if (frequency > 0) { - ScreenNative.SetRefreshRate(frequency); + ScreenNative.SetRefreshRate(laptopScreen, frequency); } if (overdrive >= 0) @@ -64,8 +66,11 @@ namespace GHelper.Display public void InitScreen() { - int frequency = ScreenNative.GetRefreshRate(); - int maxFrequency = ScreenNative.GetRefreshRate(true); + + var laptopScreen = ScreenNative.FindLaptopScreen(); + + int frequency = ScreenNative.GetRefreshRate(laptopScreen); + int maxFrequency = ScreenNative.GetMaxRefreshRate(laptopScreen); bool screenAuto = AppConfig.Is("screen_auto"); bool overdriveSetting = !AppConfig.Is("no_overdrive"); diff --git a/app/Display/ScreenNative.cs b/app/Display/ScreenNative.cs index dd1d13ec..c0da638c 100644 --- a/app/Display/ScreenNative.cs +++ b/app/Display/ScreenNative.cs @@ -116,15 +116,17 @@ namespace GHelper.Display public const int ENUM_CURRENT_SETTINGS = -1; - public const string defaultDevice = "\\\\.\\DISPLAY1"; + public const string defaultDevice = @"\\.\DISPLAY1"; - public static string? FindLaptopScreen() + public static string? FindLaptopScreen(bool log = false) { string? laptopScreen = null; try { var devices = GetAllDevices().ToArray(); + var screens = Screen.AllScreens; + int count = 0, displayNum = -1; string internalName = AppConfig.GetString("internal_display"); @@ -138,14 +140,10 @@ namespace GHelper.Display displayNum = count; AppConfig.Set("internal_display", device.monitorFriendlyDeviceName); } + if (log) Logger.WriteLine(device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString() + ": " + ((count < screens.Length) ? screens[count].DeviceName : "")); count++; - //Logger.WriteLine(device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString()); } - var screens = Screen.AllScreens; - - if (screens.Length != count) return null; - count = 0; foreach (var screen in screens) { @@ -153,7 +151,7 @@ namespace GHelper.Display { laptopScreen = screen.DeviceName; } - //Logger.WriteLine(screen.DeviceName); + //if (log) Logger.WriteLine(screen.DeviceName); count++; } @@ -170,44 +168,48 @@ namespace GHelper.Display return laptopScreen; } - public static int GetRefreshRate(bool max = false) - { - DEVMODE dm = CreateDevmode(); - string? laptopScreen = FindLaptopScreen(); + public static int GetMaxRefreshRate(string? laptopScreen) + { + + if (laptopScreen is null) return -1; + + DEVMODE dm = CreateDevmode(); int frequency = -1; - if (laptopScreen is null) - return -1; - - if (max) + int i = 0; + while (0 != EnumDisplaySettingsEx(laptopScreen, i, ref dm)) { - int i = 0; - while (0 != EnumDisplaySettingsEx(laptopScreen, i, ref dm)) - { - if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency; - i++; - } - } - else - { - if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm)) - { - frequency = dm.dmDisplayFrequency; - } + if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency; + i++; } + if (frequency > 0) AppConfig.Set("screen_max", frequency); + else frequency = AppConfig.Get("screen_max"); + + return frequency; + + } + + public static int GetRefreshRate(string? laptopScreen) + { + + if (laptopScreen is null) return -1; + + DEVMODE dm = CreateDevmode(); + int frequency = -1; + + if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm)) + { + frequency = dm.dmDisplayFrequency; + } return frequency; } - public static int SetRefreshRate(int frequency = 120) + public static int SetRefreshRate(string laptopScreen, int frequency = 120) { DEVMODE dm = CreateDevmode(); - string? laptopScreen = FindLaptopScreen(); - - if (laptopScreen is null) - return -1; if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm)) { diff --git a/app/Settings.cs b/app/Settings.cs index c668e1a4..11053d4f 100644 --- a/app/Settings.cs +++ b/app/Settings.cs @@ -639,7 +639,7 @@ namespace GHelper private void Button120Hz_Click(object? sender, EventArgs e) { AppConfig.Set("screen_auto", 0); - screenControl.SetScreen(1000, 1); + screenControl.SetScreen(ScreenControl.MAX_REFRESH, 1); } private void Button60Hz_Click(object? sender, EventArgs e)