diff --git a/app/AnimeMatrix/AniMatrix.cs b/app/AnimeMatrix/AniMatrixControl.cs similarity index 88% rename from app/AnimeMatrix/AniMatrix.cs rename to app/AnimeMatrix/AniMatrixControl.cs index a52b70f3..b7963a6f 100644 --- a/app/AnimeMatrix/AniMatrix.cs +++ b/app/AnimeMatrix/AniMatrixControl.cs @@ -8,21 +8,26 @@ using System.Timers; namespace GHelper.AnimeMatrix { - public class AniMatrix + public class AniMatrixControl { - System.Timers.Timer matrixTimer = default!; - AnimeMatrixDevice mat; - double[] AudioValues; - WasapiCapture AudioDevice; + SettingsForm settings; + + System.Timers.Timer matrixTimer = default!; + AnimeMatrixDevice? mat; + + double[]? AudioValues; + WasapiCapture? AudioDevice; public bool IsValid => mat != null; private long lastPresent; private List maxes = new List(); - public AniMatrix() + public AniMatrixControl(SettingsForm settingsForm) { + settings = settingsForm; + try { mat = new AnimeMatrixDevice(); @@ -251,12 +256,43 @@ namespace GHelper.AnimeMatrix if (maxes.Count > 20) maxes.RemoveAt(0); maxAverage = maxes.Average(); - for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i]*20/maxAverage); + for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] * 20 / maxAverage); mat.Present(); } + public void OpenMatrixPicture() + { + string fileName = null; + + Thread t = new Thread(() => + { + OpenFileDialog of = new OpenFileDialog(); + of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF"; + if (of.ShowDialog() == DialogResult.OK) + { + fileName = of.FileName; + } + return; + }); + + t.SetApartmentState(ApartmentState.STA); + t.Start(); + t.Join(); + + if (fileName is not null) + { + AppConfig.Set("matrix_picture", fileName); + AppConfig.Set("matrix_running", 2); + + SetMatrixPicture(fileName); + settings.SetMatrixRunning(2); + + } + + } + public void SetMatrixPicture(string fileName) { diff --git a/app/AppConfig.cs b/app/AppConfig.cs index a1ed375d..783f2628 100644 --- a/app/AppConfig.cs +++ b/app/AppConfig.cs @@ -68,6 +68,15 @@ public static class AppConfig return _model; } + + public static string GetModelShort() + { + string model = GetModel(); + int trim = model.LastIndexOf("_"); + if (trim > 0) model = model.Substring(0, trim); + return model; + } + public static bool ContainsModel(string contains) { diff --git a/app/AutoUpdate/AutoUpdateControl.cs b/app/AutoUpdate/AutoUpdateControl.cs new file mode 100644 index 00000000..8dba9d5d --- /dev/null +++ b/app/AutoUpdate/AutoUpdateControl.cs @@ -0,0 +1,130 @@ +using System.Diagnostics; +using System.Net; +using System.Reflection; +using System.Text.Json; + +namespace GHelper.AutoUpdate +{ + public class AutoUpdateControl + { + + SettingsForm settings; + + public string versionUrl = "http://github.com/seerge/g-helper/releases"; + static long lastUpdate; + + public AutoUpdateControl(SettingsForm settingsForm) + { + settings = settingsForm; + settings.SetVersionLabel(Properties.Strings.VersionLabel + ": " + Assembly.GetExecutingAssembly().GetName().Version); + } + + public void CheckForUpdates() + { + // Run update once per 12 hours + if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return; + lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds(); + + Task.Run(async () => + { + await Task.Delay(TimeSpan.FromSeconds(1)); + CheckForUpdatesAsync(); + }); + } + + public void LoadReleases() + { + Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true }); + } + + async void CheckForUpdatesAsync() + { + + try + { + + using (var httpClient = new HttpClient()) + { + httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App"); + var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest"); + var config = JsonSerializer.Deserialize(json); + var tag = config.GetProperty("tag_name").ToString().Replace("v", ""); + var assets = config.GetProperty("assets"); + + string url = null; + + for (int i = 0; i < assets.GetArrayLength(); i++) + { + if (assets[i].GetProperty("browser_download_url").ToString().Contains(".zip")) + url = assets[i].GetProperty("browser_download_url").ToString(); + } + + if (url is null) + url = assets[0].GetProperty("browser_download_url").ToString(); + + var gitVersion = new Version(tag); + var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString()); + //appVersion = new Version("0.50.0.0"); + + if (gitVersion.CompareTo(appVersion) > 0) + { + versionUrl = url; + settings.SetVersionLabel(Properties.Strings.DownloadUpdate + ": " + tag, true); + + if (AppConfig.GetString("skip_version") != tag) + { + DialogResult dialogResult = MessageBox.Show(Properties.Strings.DownloadUpdate + ": G-Helper " + tag + "?", "Update", MessageBoxButtons.YesNo); + if (dialogResult == DialogResult.Yes) + AutoUpdate(url); + else + AppConfig.Set("skip_version", tag); + } + + } + else + { + Logger.WriteLine($"Latest version {appVersion}"); + } + + } + } + catch (Exception ex) + { + Logger.WriteLine("Failed to check for updates:" + ex.Message); + } + + } + + + async void AutoUpdate(string requestUri) + { + + Uri uri = new Uri(requestUri); + string zipName = Path.GetFileName(uri.LocalPath); + + string exeLocation = Application.ExecutablePath; + string exeDir = Path.GetDirectoryName(exeLocation); + string zipLocation = exeDir + "\\" + zipName; + + using (WebClient client = new WebClient()) + { + client.DownloadFile(uri, zipLocation); + + Logger.WriteLine(requestUri); + Logger.WriteLine(zipLocation); + Logger.WriteLine(exeLocation); + + var cmd = new Process(); + cmd.StartInfo.UseShellExecute = false; + cmd.StartInfo.CreateNoWindow = true; + cmd.StartInfo.FileName = "powershell"; + cmd.StartInfo.Arguments = $"Start-Sleep -Seconds 1; Expand-Archive {zipLocation} -DestinationPath {exeDir} -Force; Remove-Item {zipLocation} -Force; {exeLocation}"; + cmd.Start(); + + Application.Exit(); + } + + } + + } +} diff --git a/app/Display/ScreenControl.cs b/app/Display/ScreenControl.cs index 18fe8d8f..4e2b9708 100644 --- a/app/Display/ScreenControl.cs +++ b/app/Display/ScreenControl.cs @@ -22,7 +22,7 @@ namespace GHelper.Display public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1) { - if (NativeMethods.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate + if (ScreenNative.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate { InitScreen(); return; @@ -30,12 +30,12 @@ namespace GHelper.Display if (frequency >= 1000) { - frequency = NativeMethods.GetRefreshRate(true); + frequency = ScreenNative.GetRefreshRate(true); } if (frequency > 0) { - NativeMethods.SetRefreshRate(frequency); + ScreenNative.SetRefreshRate(frequency); } if (overdrive >= 0) @@ -64,8 +64,8 @@ namespace GHelper.Display public void InitScreen() { - int frequency = NativeMethods.GetRefreshRate(); - int maxFrequency = NativeMethods.GetRefreshRate(true); + int frequency = ScreenNative.GetRefreshRate(); + int maxFrequency = ScreenNative.GetRefreshRate(true); bool screenAuto = AppConfig.Is("screen_auto"); bool overdriveSetting = !AppConfig.Is("no_overdrive"); diff --git a/app/Display/ScreenInterrogatory.cs b/app/Display/ScreenInterrogatory.cs new file mode 100644 index 00000000..d16557ef --- /dev/null +++ b/app/Display/ScreenInterrogatory.cs @@ -0,0 +1,303 @@ +using System.ComponentModel; +using System.Runtime.InteropServices; + +namespace GHelper.Display +{ + public static class ScreenInterrogatory + { + public const int ERROR_SUCCESS = 0; + + #region enums + + public enum QUERY_DEVICE_CONFIG_FLAGS : uint + { + QDC_ALL_PATHS = 0x00000001, + QDC_ONLY_ACTIVE_PATHS = 0x00000002, + QDC_DATABASE_CURRENT = 0x00000004 + } + + public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint + { + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000, + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF + } + + public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint + { + DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0, + DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED, + DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3, + DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF + } + + public enum DISPLAYCONFIG_ROTATION : uint + { + DISPLAYCONFIG_ROTATION_IDENTITY = 1, + DISPLAYCONFIG_ROTATION_ROTATE90 = 2, + DISPLAYCONFIG_ROTATION_ROTATE180 = 3, + DISPLAYCONFIG_ROTATION_ROTATE270 = 4, + DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF + } + + public enum DISPLAYCONFIG_SCALING : uint + { + DISPLAYCONFIG_SCALING_IDENTITY = 1, + DISPLAYCONFIG_SCALING_CENTERED = 2, + DISPLAYCONFIG_SCALING_STRETCHED = 3, + DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4, + DISPLAYCONFIG_SCALING_CUSTOM = 5, + DISPLAYCONFIG_SCALING_PREFERRED = 128, + DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF + } + + public enum DISPLAYCONFIG_PIXELFORMAT : uint + { + DISPLAYCONFIG_PIXELFORMAT_8BPP = 1, + DISPLAYCONFIG_PIXELFORMAT_16BPP = 2, + DISPLAYCONFIG_PIXELFORMAT_24BPP = 3, + DISPLAYCONFIG_PIXELFORMAT_32BPP = 4, + DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5, + DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff + } + + public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint + { + DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1, + DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2, + DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF + } + + public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint + { + DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3, + DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4, + DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5, + DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6, + DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF + } + + #endregion + + #region structs + + [StructLayout(LayoutKind.Sequential)] + public struct LUID + { + public uint LowPart; + public int HighPart; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_PATH_SOURCE_INFO + { + public LUID adapterId; + public uint id; + public uint modeInfoIdx; + public uint statusFlags; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_PATH_TARGET_INFO + { + public LUID adapterId; + public uint id; + public uint modeInfoIdx; + private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; + private DISPLAYCONFIG_ROTATION rotation; + private DISPLAYCONFIG_SCALING scaling; + private DISPLAYCONFIG_RATIONAL refreshRate; + private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; + public bool targetAvailable; + public uint statusFlags; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_RATIONAL + { + public uint Numerator; + public uint Denominator; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_PATH_INFO + { + public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo; + public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo; + public uint flags; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_2DREGION + { + public uint cx; + public uint cy; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO + { + public ulong pixelRate; + public DISPLAYCONFIG_RATIONAL hSyncFreq; + public DISPLAYCONFIG_RATIONAL vSyncFreq; + public DISPLAYCONFIG_2DREGION activeSize; + public DISPLAYCONFIG_2DREGION totalSize; + public uint videoStandard; + public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_TARGET_MODE + { + public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo; + } + + [StructLayout(LayoutKind.Sequential)] + public struct POINTL + { + private int x; + private int y; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_SOURCE_MODE + { + public uint width; + public uint height; + public DISPLAYCONFIG_PIXELFORMAT pixelFormat; + public POINTL position; + } + + [StructLayout(LayoutKind.Explicit)] + public struct DISPLAYCONFIG_MODE_INFO_UNION + { + [FieldOffset(0)] + public DISPLAYCONFIG_TARGET_MODE targetMode; + + [FieldOffset(0)] + public DISPLAYCONFIG_SOURCE_MODE sourceMode; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_MODE_INFO + { + public DISPLAYCONFIG_MODE_INFO_TYPE infoType; + public uint id; + public LUID adapterId; + public DISPLAYCONFIG_MODE_INFO_UNION modeInfo; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS + { + public uint value; + } + + [StructLayout(LayoutKind.Sequential)] + public struct DISPLAYCONFIG_DEVICE_INFO_HEADER + { + public DISPLAYCONFIG_DEVICE_INFO_TYPE type; + public uint size; + public LUID adapterId; + public uint id; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct DISPLAYCONFIG_TARGET_DEVICE_NAME + { + public DISPLAYCONFIG_DEVICE_INFO_HEADER header; + public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags; + public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; + public ushort edidManufactureId; + public ushort edidProductCodeId; + public uint connectorInstance; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] + public string monitorFriendlyDeviceName; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string monitorDevicePath; + } + + #endregion + + #region DLL-Imports + + [DllImport("user32.dll")] + public static extern int GetDisplayConfigBufferSizes( + QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements); + + [DllImport("user32.dll")] + public static extern int QueryDisplayConfig( + QUERY_DEVICE_CONFIG_FLAGS flags, + ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray, + ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray, + nint currentTopologyId + ); + + [DllImport("user32.dll")] + public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName); + + #endregion + + private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId) + { + var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME + { + header = + { + size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)), + adapterId = adapterId, + id = targetId, + type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME + } + }; + var error = DisplayConfigGetDeviceInfo(ref deviceName); + if (error != ERROR_SUCCESS) + throw new Win32Exception(error); + + return deviceName; + } + + public static IEnumerable GetAllDevices() + { + uint pathCount, modeCount; + var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount); + if (error != ERROR_SUCCESS) + throw new Win32Exception(error); + + var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount]; + var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount]; + error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, + ref pathCount, displayPaths, ref modeCount, displayModes, nint.Zero); + if (error != ERROR_SUCCESS) + throw new Win32Exception(error); + + for (var i = 0; i < modeCount; i++) + if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET) + yield return DeviceName(displayModes[i].adapterId, displayModes[i].id); + } + + + } + +} diff --git a/app/Display/ScreenNative.cs b/app/Display/ScreenNative.cs new file mode 100644 index 00000000..dd1d13ec --- /dev/null +++ b/app/Display/ScreenNative.cs @@ -0,0 +1,233 @@ +using System.Runtime.InteropServices; +using static GHelper.Display.ScreenInterrogatory; + +namespace GHelper.Display +{ + internal class ScreenNative + { + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] + public struct DEVMODE + { + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string dmDeviceName; + + public short dmSpecVersion; + public short dmDriverVersion; + public short dmSize; + public short dmDriverExtra; + public int dmFields; + public int dmPositionX; + public int dmPositionY; + public int dmDisplayOrientation; + public int dmDisplayFixedOutput; + public short dmColor; + public short dmDuplex; + public short dmYResolution; + public short dmTTOption; + public short dmCollate; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string dmFormName; + + public short dmLogPixels; + public short dmBitsPerPel; + public int dmPelsWidth; + public int dmPelsHeight; + public int dmDisplayFlags; + public int dmDisplayFrequency; + public int dmICMMethod; + public int dmICMIntent; + public int dmMediaType; + public int dmDitherType; + public int dmReserved1; + public int dmReserved2; + public int dmPanningWidth; + public int dmPanningHeight; + }; + + [Flags()] + public enum DisplaySettingsFlags : int + { + CDS_UPDATEREGISTRY = 1, + CDS_TEST = 2, + CDS_FULLSCREEN = 4, + CDS_GLOBAL = 8, + CDS_SET_PRIMARY = 0x10, + CDS_RESET = 0x40000000, + CDS_NORESET = 0x10000000 + } + + // PInvoke declaration for EnumDisplaySettings Win32 API + [DllImport("user32.dll")] + public static extern int EnumDisplaySettingsEx( + string lpszDeviceName, + int iModeNum, + ref DEVMODE lpDevMode); + + // PInvoke declaration for ChangeDisplaySettings Win32 API + [DllImport("user32.dll")] + public static extern int ChangeDisplaySettingsEx( + string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd, + DisplaySettingsFlags dwflags, IntPtr lParam); + + public static DEVMODE CreateDevmode() + { + DEVMODE dm = new DEVMODE(); + dm.dmDeviceName = new String(new char[32]); + dm.dmFormName = new String(new char[32]); + dm.dmSize = (short)Marshal.SizeOf(dm); + return dm; + } + + public enum COLORPROFILETYPE + { + CPT_ICC, + CPT_DMP, + CPT_CAMP, + CPT_GMMP + } + public enum COLORPROFILESUBTYPE + { + CPST_PERCEPTUAL, + CPST_RELATIVE_COLORIMETRIC, + CPST_SATURATION, + CPST_ABSOLUTE_COLORIMETRIC, + CPST_NONE, + CPST_RGB_WORKING_SPACE, + CPST_CUSTOM_WORKING_SPACE, + CPST_STANDARD_DISPLAY_COLOR_MODE, + CPST_EXTENDED_DISPLAY_COLOR_MODE + } + public enum WCS_PROFILE_MANAGEMENT_SCOPE + { + WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE, + WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER + } + + [DllImport("mscms.dll", CharSet = CharSet.Unicode)] + public static extern bool WcsSetDefaultColorProfile( + WCS_PROFILE_MANAGEMENT_SCOPE scope, + string pDeviceName, + COLORPROFILETYPE cptColorProfileType, + COLORPROFILESUBTYPE cpstColorProfileSubType, + uint dwProfileID, + string pProfileName + ); + + + public const int ENUM_CURRENT_SETTINGS = -1; + public const string defaultDevice = "\\\\.\\DISPLAY1"; + + public static string? FindLaptopScreen() + { + string? laptopScreen = null; + + try + { + var devices = GetAllDevices().ToArray(); + int count = 0, displayNum = -1; + + string internalName = AppConfig.GetString("internal_display"); + + foreach (var device in devices) + { + if (device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL || + device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED || + device.monitorFriendlyDeviceName == internalName) + { + displayNum = count; + AppConfig.Set("internal_display", device.monitorFriendlyDeviceName); + } + 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) + { + if (count == displayNum) + { + laptopScreen = screen.DeviceName; + } + //Logger.WriteLine(screen.DeviceName); + count++; + } + + if (displayNum > 0 && count == 0) laptopScreen = defaultDevice; + } + catch (Exception ex) + { + Logger.WriteLine(ex.ToString()); + Logger.WriteLine("Can't detect internal screen"); + laptopScreen = Screen.PrimaryScreen.DeviceName; + } + + + return laptopScreen; + } + + public static int GetRefreshRate(bool max = false) + { + DEVMODE dm = CreateDevmode(); + + string? laptopScreen = FindLaptopScreen(); + int frequency = -1; + + if (laptopScreen is null) + return -1; + + if (max) + { + 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; + } + } + + + return frequency; + } + + public static int SetRefreshRate(int frequency = 120) + { + DEVMODE dm = CreateDevmode(); + string? laptopScreen = FindLaptopScreen(); + + if (laptopScreen is null) + return -1; + + if (0 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm)) + { + dm.dmDisplayFrequency = frequency; + int iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); + Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet)); + + //Fallback scenario + if (iRet != 0) + { + Thread.Sleep(300); + iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); + Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet)); + } + + return iRet; + } + + return 0; + + } + } +} diff --git a/app/Fans.cs b/app/Fans.cs index 2dd0a275..8648c2a4 100644 --- a/app/Fans.cs +++ b/app/Fans.cs @@ -577,7 +577,7 @@ namespace GHelper public void InitBoost() { - int boost = NativeMethods.GetCPUBoost(); + int boost = PowerNative.GetCPUBoost(); if (boost >= 0) comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1); } @@ -586,7 +586,7 @@ namespace GHelper { if (AppConfig.GetMode("auto_boost") != comboBoost.SelectedIndex) { - NativeMethods.SetCPUBoost(comboBoost.SelectedIndex); + PowerNative.SetCPUBoost(comboBoost.SelectedIndex); } AppConfig.SetMode("auto_boost", comboBoost.SelectedIndex); } diff --git a/app/GHelper.csproj b/app/GHelper.csproj index b504f567..323bb1c4 100644 --- a/app/GHelper.csproj +++ b/app/GHelper.csproj @@ -16,7 +16,7 @@ AnyCPU False True - 0.92 + 0.93 diff --git a/app/Gpu/GPUModeControl.cs b/app/Gpu/GPUModeControl.cs index 59ce9a7d..e1cd8a74 100644 --- a/app/Gpu/GPUModeControl.cs +++ b/app/Gpu/GPUModeControl.cs @@ -7,9 +7,14 @@ namespace GHelper.Gpu { public class GPUModeControl { - static SettingsForm settings = Program.settingsForm; + SettingsForm settings; ScreenControl screenControl = new ScreenControl(); + public GPUModeControl(SettingsForm settingsForm) + { + settings = settingsForm; + } + public void InitGPUMode() { int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco); diff --git a/app/Mode/ModeControl.cs b/app/Mode/ModeControl.cs index 2938832a..f4e29596 100644 --- a/app/Mode/ModeControl.cs +++ b/app/Mode/ModeControl.cs @@ -78,14 +78,14 @@ namespace GHelper.Mode if (AppConfig.Get("auto_apply_power_plan") != 0) { if (AppConfig.GetModeString("scheme") is not null) - NativeMethods.SetPowerScheme(AppConfig.GetModeString("scheme")); + PowerNative.SetPowerScheme(AppConfig.GetModeString("scheme")); else - NativeMethods.SetPowerScheme(Modes.GetBase(mode)); + PowerNative.SetPowerScheme(Modes.GetBase(mode)); } if (AppConfig.GetMode("auto_boost") != -1) { - NativeMethods.SetCPUBoost(AppConfig.GetMode("auto_boost")); + PowerNative.SetCPUBoost(AppConfig.GetMode("auto_boost")); } /* diff --git a/app/Mode/PowerNative.cs b/app/Mode/PowerNative.cs new file mode 100644 index 00000000..4153edb2 --- /dev/null +++ b/app/Mode/PowerNative.cs @@ -0,0 +1,161 @@ +using System.Runtime.InteropServices; + +namespace GHelper.Mode +{ + internal class PowerNative + { + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey, + [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, + int AcValueIndex); + + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey, + [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, + int AcValueIndex); + + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerReadACValueIndex(IntPtr RootPowerKey, + [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, + out IntPtr AcValueIndex + ); + + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey, + [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, + [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, + out IntPtr AcValueIndex + ); + + + [DllImport("powrprof.dll")] + static extern uint PowerReadACValue( + IntPtr RootPowerKey, + Guid SchemeGuid, + Guid SubGroupOfPowerSettingGuid, + Guid PowerSettingGuid, + ref int Type, + ref IntPtr Buffer, + ref uint BufferSize + ); + + + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey, + [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid); + + [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] + static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid); + + static readonly Guid GUID_CPU = new Guid("54533251-82be-4824-96c1-47b60b740d00"); + static readonly Guid GUID_BOOST = new Guid("be337238-0d82-4146-a960-4f3749d470c7"); + + private static Guid GUID_SLEEP_SUBGROUP = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20"); + private static Guid GUID_HIBERNATEIDLE = new Guid("9d7815a6-7ee4-497e-8888-515a05f02364"); + + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetActualOverlayScheme")] + public static extern uint PowerGetActualOverlayScheme(out Guid ActualOverlayGuid); + + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetEffectiveOverlayScheme")] + public static extern uint PowerGetEffectiveOverlayScheme(out Guid EffectiveOverlayGuid); + + [DllImportAttribute("powrprof.dll", EntryPoint = "PowerSetActiveOverlayScheme")] + public static extern uint PowerSetActiveOverlayScheme(Guid OverlaySchemeGuid); + + + static Guid GetActiveScheme() + { + IntPtr pActiveSchemeGuid; + var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid); + Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid)); + return activeSchemeGuid; + } + + public static int GetCPUBoost() + { + IntPtr AcValueIndex; + Guid activeSchemeGuid = GetActiveScheme(); + + UInt32 value = PowerReadACValueIndex(IntPtr.Zero, + activeSchemeGuid, + GUID_CPU, + GUID_BOOST, out AcValueIndex); + + return AcValueIndex.ToInt32(); + + } + + public static void SetCPUBoost(int boost = 0) + { + Guid activeSchemeGuid = GetActiveScheme(); + + if (boost == GetCPUBoost()) return; + + var hrAC = PowerWriteACValueIndex( + IntPtr.Zero, + activeSchemeGuid, + GUID_CPU, + GUID_BOOST, + boost); + + PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); + + var hrDC = PowerWriteDCValueIndex( + IntPtr.Zero, + activeSchemeGuid, + GUID_CPU, + GUID_BOOST, + boost); + + PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); + + Logger.WriteLine("Boost " + boost); + } + + public static void SetPowerScheme(string scheme) + { + List overlays = new() { + "00000000-0000-0000-0000-000000000000", + "ded574b5-45a0-4f42-8737-46345c09c238", + "961cc777-2547-4f9d-8174-7d86181b8a7a", + "3af9B8d9-7c97-431d-ad78-34a8bfea439f" + }; + + if (overlays.Contains(scheme)) + { + PowerSetActiveOverlayScheme(new Guid(scheme)); + Logger.WriteLine("Power mode:" + scheme); + } + else + { + PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme)); + Logger.WriteLine("Power plan:" + scheme); + } + + + } + + public static void SetPowerScheme(int mode) + { + switch (mode) + { + case 0: // balanced + PowerSetActiveOverlayScheme(new Guid("00000000-0000-0000-0000-000000000000")); + break; + case 1: // turbo + PowerSetActiveOverlayScheme(new Guid("ded574b5-45a0-4f42-8737-46345c09c238")); + break; + case 2: //silent + PowerSetActiveOverlayScheme(new Guid("961cc777-2547-4f9d-8174-7d86181b8a7a")); + break; + } + } + } +} diff --git a/app/NativeMethods.cs b/app/NativeMethods.cs index 36d26f55..0b79204f 100644 --- a/app/NativeMethods.cs +++ b/app/NativeMethods.cs @@ -1,310 +1,5 @@ -using System.ComponentModel; -using System.Diagnostics; -using System.Runtime.InteropServices; -using static Tools.ScreenInterrogatory; +using System.Runtime.InteropServices; -namespace Tools -{ - - - public static class ScreenInterrogatory - { - public const int ERROR_SUCCESS = 0; - - #region enums - - public enum QUERY_DEVICE_CONFIG_FLAGS : uint - { - QDC_ALL_PATHS = 0x00000001, - QDC_ONLY_ACTIVE_PATHS = 0x00000002, - QDC_DATABASE_CURRENT = 0x00000004 - } - - public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint - { - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000, - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF - } - - public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint - { - DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0, - DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1, - DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2, - DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED, - DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3, - DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF - } - - public enum DISPLAYCONFIG_ROTATION : uint - { - DISPLAYCONFIG_ROTATION_IDENTITY = 1, - DISPLAYCONFIG_ROTATION_ROTATE90 = 2, - DISPLAYCONFIG_ROTATION_ROTATE180 = 3, - DISPLAYCONFIG_ROTATION_ROTATE270 = 4, - DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF - } - - public enum DISPLAYCONFIG_SCALING : uint - { - DISPLAYCONFIG_SCALING_IDENTITY = 1, - DISPLAYCONFIG_SCALING_CENTERED = 2, - DISPLAYCONFIG_SCALING_STRETCHED = 3, - DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4, - DISPLAYCONFIG_SCALING_CUSTOM = 5, - DISPLAYCONFIG_SCALING_PREFERRED = 128, - DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF - } - - public enum DISPLAYCONFIG_PIXELFORMAT : uint - { - DISPLAYCONFIG_PIXELFORMAT_8BPP = 1, - DISPLAYCONFIG_PIXELFORMAT_16BPP = 2, - DISPLAYCONFIG_PIXELFORMAT_24BPP = 3, - DISPLAYCONFIG_PIXELFORMAT_32BPP = 4, - DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5, - DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff - } - - public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint - { - DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1, - DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2, - DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF - } - - public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint - { - DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1, - DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2, - DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3, - DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4, - DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5, - DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6, - DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF - } - - #endregion - - #region structs - - [StructLayout(LayoutKind.Sequential)] - public struct LUID - { - public uint LowPart; - public int HighPart; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_PATH_SOURCE_INFO - { - public LUID adapterId; - public uint id; - public uint modeInfoIdx; - public uint statusFlags; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_PATH_TARGET_INFO - { - public LUID adapterId; - public uint id; - public uint modeInfoIdx; - private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; - private DISPLAYCONFIG_ROTATION rotation; - private DISPLAYCONFIG_SCALING scaling; - private DISPLAYCONFIG_RATIONAL refreshRate; - private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; - public bool targetAvailable; - public uint statusFlags; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_RATIONAL - { - public uint Numerator; - public uint Denominator; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_PATH_INFO - { - public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo; - public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo; - public uint flags; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_2DREGION - { - public uint cx; - public uint cy; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO - { - public ulong pixelRate; - public DISPLAYCONFIG_RATIONAL hSyncFreq; - public DISPLAYCONFIG_RATIONAL vSyncFreq; - public DISPLAYCONFIG_2DREGION activeSize; - public DISPLAYCONFIG_2DREGION totalSize; - public uint videoStandard; - public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_TARGET_MODE - { - public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo; - } - - [StructLayout(LayoutKind.Sequential)] - public struct POINTL - { - private int x; - private int y; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_SOURCE_MODE - { - public uint width; - public uint height; - public DISPLAYCONFIG_PIXELFORMAT pixelFormat; - public POINTL position; - } - - [StructLayout(LayoutKind.Explicit)] - public struct DISPLAYCONFIG_MODE_INFO_UNION - { - [FieldOffset(0)] - public DISPLAYCONFIG_TARGET_MODE targetMode; - - [FieldOffset(0)] - public DISPLAYCONFIG_SOURCE_MODE sourceMode; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_MODE_INFO - { - public DISPLAYCONFIG_MODE_INFO_TYPE infoType; - public uint id; - public LUID adapterId; - public DISPLAYCONFIG_MODE_INFO_UNION modeInfo; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS - { - public uint value; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DISPLAYCONFIG_DEVICE_INFO_HEADER - { - public DISPLAYCONFIG_DEVICE_INFO_TYPE type; - public uint size; - public LUID adapterId; - public uint id; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public struct DISPLAYCONFIG_TARGET_DEVICE_NAME - { - public DISPLAYCONFIG_DEVICE_INFO_HEADER header; - public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags; - public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology; - public ushort edidManufactureId; - public ushort edidProductCodeId; - public uint connectorInstance; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] - public string monitorFriendlyDeviceName; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] - public string monitorDevicePath; - } - - #endregion - - #region DLL-Imports - - [DllImport("user32.dll")] - public static extern int GetDisplayConfigBufferSizes( - QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements); - - [DllImport("user32.dll")] - public static extern int QueryDisplayConfig( - QUERY_DEVICE_CONFIG_FLAGS flags, - ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray, - ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray, - IntPtr currentTopologyId - ); - - [DllImport("user32.dll")] - public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName); - - #endregion - - private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId) - { - var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME - { - header = - { - size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)), - adapterId = adapterId, - id = targetId, - type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME - } - }; - var error = DisplayConfigGetDeviceInfo(ref deviceName); - if (error != ERROR_SUCCESS) - throw new Win32Exception(error); - - return deviceName; - } - - public static IEnumerable GetAllDevices() - { - uint pathCount, modeCount; - var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount); - if (error != ERROR_SUCCESS) - throw new Win32Exception(error); - - var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount]; - var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount]; - error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, - ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero); - if (error != ERROR_SUCCESS) - throw new Win32Exception(error); - - for (var i = 0; i < modeCount; i++) - if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET) - yield return DeviceName(displayModes[i].adapterId, displayModes[i].id); - } - - - } - -} public class NativeMethods { @@ -327,9 +22,6 @@ public class NativeMethods } - [DllImport("User32.dll")] - public static extern bool SetForegroundWindow(IntPtr handle); - private const int WM_SYSCOMMAND = 0x0112; private const int SC_MONITORPOWER = 0xF170; private const int MONITOR_OFF = 2; @@ -414,430 +106,5 @@ public class NativeMethods } - [DllImport("Powrprof.dll", CharSet = CharSet.Auto, ExactSpelling = true)] - public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent); - - [DllImport("user32.dll")] - public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); - public const int SW_RESTORE = 9; - - public static bool SwitchToCurrent() - { - IntPtr hWnd = IntPtr.Zero; - Process process = Process.GetCurrentProcess(); - Process[] processes = Process.GetProcessesByName(process.ProcessName); - foreach (Process _process in processes) - { - if (_process.Id != process.Id) - { - - if (_process.MainWindowHandle != IntPtr.Zero) - { - Debug.WriteLine(_process.Id); - Debug.WriteLine(process.Id); - - hWnd = _process.MainWindowHandle; - ShowWindowAsync(hWnd, SW_RESTORE); - } - - return true; - break; - } - } - - return false; - } - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey, - [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, - int AcValueIndex); - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey, - [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, - int AcValueIndex); - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerReadACValueIndex(IntPtr RootPowerKey, - [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, - out IntPtr AcValueIndex - ); - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey, - [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid, - [MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid, - out IntPtr AcValueIndex - ); - - - [DllImport("powrprof.dll")] - static extern uint PowerReadACValue( - IntPtr RootPowerKey, - Guid SchemeGuid, - Guid SubGroupOfPowerSettingGuid, - Guid PowerSettingGuid, - ref int Type, - ref IntPtr Buffer, - ref uint BufferSize - ); - - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey, - [MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid); - - [DllImport("PowrProf.dll", CharSet = CharSet.Unicode)] - static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid); - - static readonly Guid GUID_CPU = new Guid("54533251-82be-4824-96c1-47b60b740d00"); - static readonly Guid GUID_BOOST = new Guid("be337238-0d82-4146-a960-4f3749d470c7"); - - private static Guid GUID_SLEEP_SUBGROUP = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20"); - private static Guid GUID_HIBERNATEIDLE = new Guid("9d7815a6-7ee4-497e-8888-515a05f02364"); - - [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetActualOverlayScheme")] - public static extern uint PowerGetActualOverlayScheme(out Guid ActualOverlayGuid); - - [DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetEffectiveOverlayScheme")] - public static extern uint PowerGetEffectiveOverlayScheme(out Guid EffectiveOverlayGuid); - - [DllImportAttribute("powrprof.dll", EntryPoint = "PowerSetActiveOverlayScheme")] - public static extern uint PowerSetActiveOverlayScheme(Guid OverlaySchemeGuid); - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] - public struct DEVMODE - { - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] - public string dmDeviceName; - - public short dmSpecVersion; - public short dmDriverVersion; - public short dmSize; - public short dmDriverExtra; - public int dmFields; - public int dmPositionX; - public int dmPositionY; - public int dmDisplayOrientation; - public int dmDisplayFixedOutput; - public short dmColor; - public short dmDuplex; - public short dmYResolution; - public short dmTTOption; - public short dmCollate; - - [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] - public string dmFormName; - - public short dmLogPixels; - public short dmBitsPerPel; - public int dmPelsWidth; - public int dmPelsHeight; - public int dmDisplayFlags; - public int dmDisplayFrequency; - public int dmICMMethod; - public int dmICMIntent; - public int dmMediaType; - public int dmDitherType; - public int dmReserved1; - public int dmReserved2; - public int dmPanningWidth; - public int dmPanningHeight; - }; - - [Flags()] - public enum DisplaySettingsFlags : int - { - CDS_UPDATEREGISTRY = 1, - CDS_TEST = 2, - CDS_FULLSCREEN = 4, - CDS_GLOBAL = 8, - CDS_SET_PRIMARY = 0x10, - CDS_RESET = 0x40000000, - CDS_NORESET = 0x10000000 - } - - // PInvoke declaration for EnumDisplaySettings Win32 API - [DllImport("user32.dll")] - public static extern int EnumDisplaySettingsEx( - string lpszDeviceName, - int iModeNum, - ref DEVMODE lpDevMode); - - // PInvoke declaration for ChangeDisplaySettings Win32 API - [DllImport("user32.dll")] - public static extern int ChangeDisplaySettingsEx( - string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd, - DisplaySettingsFlags dwflags, IntPtr lParam); - - public static DEVMODE CreateDevmode() - { - DEVMODE dm = new DEVMODE(); - dm.dmDeviceName = new String(new char[32]); - dm.dmFormName = new String(new char[32]); - dm.dmSize = (short)Marshal.SizeOf(dm); - return dm; - } - - public enum COLORPROFILETYPE - { - CPT_ICC, - CPT_DMP, - CPT_CAMP, - CPT_GMMP - } - public enum COLORPROFILESUBTYPE - { - CPST_PERCEPTUAL, - CPST_RELATIVE_COLORIMETRIC, - CPST_SATURATION, - CPST_ABSOLUTE_COLORIMETRIC, - CPST_NONE, - CPST_RGB_WORKING_SPACE, - CPST_CUSTOM_WORKING_SPACE, - CPST_STANDARD_DISPLAY_COLOR_MODE, - CPST_EXTENDED_DISPLAY_COLOR_MODE - } - public enum WCS_PROFILE_MANAGEMENT_SCOPE - { - WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE, - WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER - } - - [DllImport("mscms.dll", CharSet = CharSet.Unicode)] - public static extern bool WcsSetDefaultColorProfile( - WCS_PROFILE_MANAGEMENT_SCOPE scope, - string pDeviceName, - COLORPROFILETYPE cptColorProfileType, - COLORPROFILESUBTYPE cpstColorProfileSubType, - uint dwProfileID, - string pProfileName - ); - - - public const int ENUM_CURRENT_SETTINGS = -1; - public const string defaultDevice = "\\\\.\\DISPLAY1"; - - public static string FindLaptopScreen() - { - string laptopScreen = null; - - try - { - var devices = GetAllDevices().ToArray(); - int count = 0, displayNum = -1; - - string internalName = AppConfig.GetString("internal_display"); - - foreach (var device in devices) - { - if (device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL || - device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED || - device.monitorFriendlyDeviceName == internalName) - { - displayNum = count; - AppConfig.Set("internal_display", device.monitorFriendlyDeviceName); - } - 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) - { - if (count == displayNum) - { - laptopScreen = screen.DeviceName; - } - //Logger.WriteLine(screen.DeviceName); - count++; - } - - if (displayNum > 0 && count == 0) laptopScreen = defaultDevice; - } - catch (Exception ex) - { - Logger.WriteLine(ex.ToString()); - Logger.WriteLine("Can't detect internal screen"); - laptopScreen = Screen.PrimaryScreen.DeviceName; - } - - - return laptopScreen; - } - - public static int GetRefreshRate(bool max = false) - { - DEVMODE dm = CreateDevmode(); - - string laptopScreen = FindLaptopScreen(); - int frequency = -1; - - if (laptopScreen is null) - return -1; - - if (max) - { - int i = 0; - while (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, i, ref dm)) - { - if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency; - i++; - } - } - else - { - if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) - { - frequency = dm.dmDisplayFrequency; - } - } - - - return frequency; - } - - public static int SetRefreshRate(int frequency = 120) - { - DEVMODE dm = CreateDevmode(); - string laptopScreen = FindLaptopScreen(); - - if (laptopScreen is null) - return -1; - - if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm)) - { - dm.dmDisplayFrequency = frequency; - int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); - Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet)); - - //Fallback scenario - if (iRet != 0) - { - Thread.Sleep(300); - iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); - Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet)); - } - - return iRet; - } - - return 0; - - } - - public static nint GetHuibernateAfter() - { - Guid activePolicyGuid = GetActiveScheme(); - var type = 0; - nint value = 0; - var valueSize = 4u; - - PowerReadACValue(IntPtr.Zero, activePolicyGuid, - GUID_SLEEP_SUBGROUP, GUID_HIBERNATEIDLE, - ref type, ref value, ref valueSize); - - return value; - } - - static Guid GetActiveScheme() - { - IntPtr pActiveSchemeGuid; - var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid); - Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid)); - return activeSchemeGuid; - } - - public static int GetCPUBoost() - { - IntPtr AcValueIndex; - Guid activeSchemeGuid = GetActiveScheme(); - - UInt32 value = PowerReadACValueIndex(IntPtr.Zero, - activeSchemeGuid, - GUID_CPU, - GUID_BOOST, out AcValueIndex); - - return AcValueIndex.ToInt32(); - - } - - public static void SetCPUBoost(int boost = 0) - { - Guid activeSchemeGuid = GetActiveScheme(); - - if (boost == GetCPUBoost()) return; - - var hrAC = PowerWriteACValueIndex( - IntPtr.Zero, - activeSchemeGuid, - GUID_CPU, - GUID_BOOST, - boost); - - PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); - - var hrDC = PowerWriteDCValueIndex( - IntPtr.Zero, - activeSchemeGuid, - GUID_CPU, - GUID_BOOST, - boost); - - PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid); - - Logger.WriteLine("Boost " + boost); - } - - public static void SetPowerScheme(string scheme) - { - List overlays = new() { - "00000000-0000-0000-0000-000000000000", - "ded574b5-45a0-4f42-8737-46345c09c238", - "961cc777-2547-4f9d-8174-7d86181b8a7a", - "3af9B8d9-7c97-431d-ad78-34a8bfea439f" - }; - - if (overlays.Contains(scheme)) - { - PowerSetActiveOverlayScheme(new Guid(scheme)); - Logger.WriteLine("Power mode:" + scheme); - } - else - { - PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme)); - Logger.WriteLine("Power plan:" + scheme); - } - - - } - - public static void SetPowerScheme(int mode) - { - switch (mode) - { - case 0: // balanced - PowerSetActiveOverlayScheme(new Guid("00000000-0000-0000-0000-000000000000")); - break; - case 1: // turbo - PowerSetActiveOverlayScheme(new Guid("ded574b5-45a0-4f42-8737-46345c09c238")); - break; - case 2: //silent - PowerSetActiveOverlayScheme(new Guid("961cc777-2547-4f9d-8174-7d86181b8a7a")); - break; - } - } } diff --git a/app/Program.cs b/app/Program.cs index 165cfa8b..ecb89fab 100644 --- a/app/Program.cs +++ b/app/Program.cs @@ -9,6 +9,7 @@ using System.Diagnostics; using System.Globalization; using System.Reflection; using static NativeMethods; +using GHelper.AutoUpdate; namespace GHelper { @@ -27,7 +28,7 @@ namespace GHelper public static SettingsForm settingsForm = new SettingsForm(); public static ModeControl modeControl = new ModeControl(); - static GPUModeControl gpuControl = new GPUModeControl(); + static GPUModeControl gpuControl = new GPUModeControl(settingsForm); static ScreenControl screenControl = new ScreenControl(); public static ToastForm toast = new ToastForm(); diff --git a/app/Settings.cs b/app/Settings.cs index 5ab1aec4..a5bf6dff 100644 --- a/app/Settings.cs +++ b/app/Settings.cs @@ -1,14 +1,12 @@ using GHelper.AnimeMatrix; +using GHelper.AutoUpdate; +using GHelper.Display; using GHelper.Gpu; using GHelper.Helpers; using GHelper.Input; using GHelper.Mode; -using GHelper.Display; using GHelper.UI; using System.Diagnostics; -using System.Net; -using System.Reflection; -using System.Text.Json; using System.Timers; namespace GHelper @@ -20,28 +18,32 @@ namespace GHelper ContextMenuStrip contextMenuStrip = new CustomContextMenu(); ToolStripMenuItem menuSilent, menuBalanced, menuTurbo, menuEco, menuStandard, menuUltimate, menuOptimized; - GPUModeControl gpuControl = new GPUModeControl(); + GPUModeControl gpuControl; ScreenControl screenControl = new ScreenControl(); + AutoUpdateControl updateControl; - public static System.Timers.Timer aTimer = default!; - public string versionUrl = "http://github.com/seerge/g-helper/releases"; + public AniMatrixControl matrix; - public AniMatrix matrix; - public Fans fans; - public Extra keyb; - public Updates updates; + public static System.Timers.Timer sensorTimer = default!; + + public Fans? fans; + public Extra? keyb; + public Updates? updates; - static long lastUpdate; static long lastRefresh; bool isGpuSection = true; public SettingsForm() { - + InitializeComponent(); InitTheme(true); + gpuControl = new GPUModeControl(this); + updateControl = new AutoUpdateControl(this); + matrix = new AniMatrixControl(this); + buttonSilent.Text = Properties.Strings.Silent; buttonBalanced.Text = Properties.Strings.Balanced; buttonTurbo.Text = Properties.Strings.Turbo; @@ -166,18 +168,11 @@ namespace GHelper sliderBattery.ValueChanged += SliderBattery_ValueChanged; Program.trayIcon.MouseMove += TrayIcon_MouseMove; - aTimer = new System.Timers.Timer(1000); - aTimer.Elapsed += OnTimedEvent; - aTimer.Enabled = true; - - SetVersionLabel(Properties.Strings.VersionLabel + ": " + Assembly.GetExecutingAssembly().GetName().Version); - - string model = AppConfig.GetModel(); - int trim = model.LastIndexOf("_"); - if (trim > 0) model = model.Substring(0, trim); - - labelModel.Text = model + (ProcessHelper.IsUserAdministrator() ? "." : ""); + sensorTimer = new System.Timers.Timer(1000); + sensorTimer.Elapsed += OnTimedEvent; + sensorTimer.Enabled = true; + labelModel.Text = AppConfig.GetModelShort() + (ProcessHelper.IsUserAdministrator() ? "." : ""); TopMost = AppConfig.Is("topmost"); SetContextMenu(); @@ -186,22 +181,12 @@ namespace GHelper private void SettingsForm_VisibleChanged(object? sender, EventArgs e) { - aTimer.Enabled = this.Visible; + sensorTimer.Enabled = this.Visible; if (this.Visible) { screenControl.InitScreen(); gpuControl.InitXGM(); - - // Run update once per 12 hours - if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return; - lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds(); - - Task.Run(async () => - { - await Task.Delay(TimeSpan.FromSeconds(1)); - CheckForUpdatesAsync(); - }); - + updateControl.CheckForUpdates(); } } @@ -350,111 +335,19 @@ namespace GHelper } - public async void CheckForUpdatesAsync() + public void SetVersionLabel(string label, bool update = false) { - - try - { - - using (var httpClient = new HttpClient()) - { - httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App"); - var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest"); - var config = JsonSerializer.Deserialize(json); - var tag = config.GetProperty("tag_name").ToString().Replace("v", ""); - var assets = config.GetProperty("assets"); - - string url = null; - - for (int i = 0; i < assets.GetArrayLength(); i++) - { - if (assets[i].GetProperty("browser_download_url").ToString().Contains(".zip")) - url = assets[i].GetProperty("browser_download_url").ToString(); - } - - if (url is null) - url = assets[0].GetProperty("browser_download_url").ToString(); - - var gitVersion = new Version(tag); - var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString()); - //appVersion = new Version("0.50.0.0"); - - if (gitVersion.CompareTo(appVersion) > 0) - { - SetVersionLabel(Properties.Strings.DownloadUpdate + ": " + tag, url); - if (AppConfig.GetString("skip_version") != tag) - { - DialogResult dialogResult = MessageBox.Show(Properties.Strings.DownloadUpdate + ": G-Helper " + tag + "?", "Update", MessageBoxButtons.YesNo); - if (dialogResult == DialogResult.Yes) - AutoUpdate(url); - else - AppConfig.Set("skip_version", tag); - } - - } - else - { - Debug.WriteLine("Latest version"); - } - - } - } - catch (Exception ex) - { - Debug.WriteLine("Failed to check for updates:" + ex.Message); - } - - } - - void SetVersionLabel(string label, string url = null) - { - BeginInvoke(delegate + Invoke(delegate { labelVersion.Text = label; - if (url is not null) - { - this.versionUrl = url; - labelVersion.ForeColor = Color.Red; - } + if (update) labelVersion.ForeColor = colorTurbo; }); - - } - - - public async void AutoUpdate(string requestUri) - { - - Uri uri = new Uri(requestUri); - string zipName = Path.GetFileName(uri.LocalPath); - - string exeLocation = Application.ExecutablePath; - string exeDir = Path.GetDirectoryName(exeLocation); - string zipLocation = exeDir + "\\" + zipName; - - using (WebClient client = new WebClient()) - { - client.DownloadFile(uri, zipLocation); - - Logger.WriteLine(requestUri); - Logger.WriteLine(zipLocation); - Logger.WriteLine(exeLocation); - - var cmd = new Process(); - cmd.StartInfo.UseShellExecute = false; - cmd.StartInfo.CreateNoWindow = true; - cmd.StartInfo.FileName = "powershell"; - cmd.StartInfo.Arguments = $"Start-Sleep -Seconds 1; Expand-Archive {zipLocation} -DestinationPath {exeDir} -Force; Remove-Item {zipLocation} -Force; {exeLocation}"; - cmd.Start(); - - Application.Exit(); - } - } private void LabelVersion_Click(object? sender, EventArgs e) { - Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true }); + updateControl.LoadReleases(); } private static void TrayIcon_MouseMove(object? sender, MouseEventArgs e) @@ -553,59 +446,36 @@ namespace GHelper private void CheckMatrix_CheckedChanged(object? sender, EventArgs e) { - if (sender is null) return; - CheckBox check = (CheckBox)sender; - AppConfig.Set("matrix_auto", check.Checked ? 1 : 0); - matrix?.SetMatrix(); + AppConfig.Set("matrix_auto", checkMatrix.Checked ? 1 : 0); + matrix.SetMatrix(); } private void ButtonMatrix_Click(object? sender, EventArgs e) { - string fileName = null; + matrix.OpenMatrixPicture(); + } - Thread t = new Thread(() => + public void SetMatrixRunning(int mode) + { + Invoke(delegate { - OpenFileDialog of = new OpenFileDialog(); - of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF"; - if (of.ShowDialog() == DialogResult.OK) - { - fileName = of.FileName; - } - return; + comboMatrixRunning.SelectedIndex = mode; }); - - t.SetApartmentState(ApartmentState.STA); - t.Start(); - t.Join(); - - if (fileName is not null) - { - AppConfig.Set("matrix_picture", fileName); - AppConfig.Set("matrix_running", 2); - - matrix?.SetMatrixPicture(fileName); - BeginInvoke(delegate - { - comboMatrixRunning.SelectedIndex = 2; - }); - } - - } private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e) { AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex); - matrix?.SetMatrix(); + matrix.SetMatrix(); } private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e) { AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex); - matrix?.SetMatrix(); + matrix.SetMatrix(); } @@ -727,8 +597,6 @@ namespace GHelper public void InitMatrix() { - matrix = new AniMatrix(); - if (!matrix.IsValid) { panelMatrix.Visible = false; @@ -1037,7 +905,7 @@ namespace GHelper public void HideGPUModes() { isGpuSection = false; - + buttonEco.Visible = false; buttonStandard.Visible = false; buttonUltimate.Visible = false;