Compare commits

...

7 Commits
v0.7 ... v0.8.1

6 changed files with 122 additions and 32 deletions

View File

@@ -31,7 +31,6 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
<PackageReference Include="System.Management" Version="7.0.0" />
<PackageReference Include="TaskScheduler" Version="2.10.1" />
</ItemGroup>

View File

@@ -1,11 +1,12 @@
using Microsoft.Win32.TaskScheduler;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.InteropServices;
using System.Text.Json;
using System.Text.Json.Serialization;
public class ASUSWmi
{
private ManagementObject mo;
@@ -170,9 +171,14 @@ public class AppConfig
if (File.Exists(configFile))
{
string text = File.ReadAllText(configFile);
config = JsonConvert.DeserializeObject<Dictionary<string, object>>(text);
if (config is null)
try
{
config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
}
catch
{
initConfig();
}
}
else
{
@@ -185,7 +191,7 @@ public class AppConfig
{
config = new Dictionary<string, object>();
config["performance_mode"] = 0;
string jsonString = JsonConvert.SerializeObject(config);
string jsonString = JsonSerializer.Serialize(config);
File.WriteAllText(configFile, jsonString);
}
@@ -199,7 +205,7 @@ public class AppConfig
public void setConfig(string name, int value)
{
config[name] = value;
string jsonString = JsonConvert.SerializeObject(config);
string jsonString = JsonSerializer.Serialize(config);
File.WriteAllText(configFile, jsonString);
}
@@ -251,21 +257,35 @@ public class NativeMethods
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 EnumDisplaySettingsExA(
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 ChangeDisplaySettings(
ref DEVMODE lpDevMode,
int dwFlags);
public static extern int ChangeDisplaySettingsEx(
string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd,
DisplaySettingsFlags dwflags, IntPtr lParam);
public const int ENUM_CURRENT_SETTINGS = -1;
public const string laptopScreenName = "\\\\.\\DISPLAY1";
public static DEVMODE CreateDevmode()
{
@@ -276,30 +296,58 @@ public class NativeMethods
return dm;
}
public static Screen FindLaptopScreen()
{
var screens = Screen.AllScreens;
Screen laptopScreen = null;
foreach (var screen in screens)
{
if (screen.DeviceName == laptopScreenName)
{
laptopScreen = screen;
}
}
if (laptopScreen is null) return null;
else return laptopScreen;
}
public static int GetRefreshRate()
{
DEVMODE dm = CreateDevmode();
Screen laptopScreen = FindLaptopScreen();
int frequency = -1;
if (0 != NativeMethods.EnumDisplaySettingsExA(null, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
if (laptopScreen is null)
return -1;
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen.DeviceName, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
{
Debug.WriteLine(JsonConvert.SerializeObject(dm));
frequency = dm.dmDisplayFrequency;
}
return frequency;
}
public static void SetRefreshRate(int frequency = 120)
public static int SetRefreshRate(int frequency = 120)
{
DEVMODE dm = CreateDevmode();
Screen laptopScreen = FindLaptopScreen();
if (0 != NativeMethods.EnumDisplaySettingsExA(null,NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
if (laptopScreen is null)
return -1;
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen.DeviceName, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
{
dm.dmDisplayFrequency = frequency;
int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);
int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen.DeviceName, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
return iRet;
}
return 0;
}
}

View File

@@ -26,7 +26,8 @@ Profiles are **same** as in Armory Crate, including default fan curves
2. CPU and GPU relative fan speed monitoring
3. Automatic switching of Standard/Eco GPU modes when laptop is plugged / unplugged!
4. FN+F5 an M4 (Rog) keys cycle through Performance modes
5. Start with windows (optional)
5. Screen resolution and display overdrive switching
6. Run on startup (optional)
## How to install
@@ -41,7 +42,7 @@ I don`t have Microsoft certificate to sign app yet, so if you set a warning from
Alternatively you can comile and run project by yourself :)
Settings are located in APPDATA\ROAMING
Settings file is storer at %AppData%\GHelper
P.S.: It's not recommended to use app in combination with Armory Crate, cause they adjust same settings.
Please keep in mind, that if you also run MyASUS app periodically it will also try to adjust same battery charge settings

3
Settings.Designer.cs generated
View File

@@ -367,6 +367,7 @@
//
this.button120Hz.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.button120Hz.Dock = System.Windows.Forms.DockStyle.Fill;
this.button120Hz.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveBorder;
this.button120Hz.FlatAppearance.BorderSize = 0;
this.button120Hz.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button120Hz.Location = new System.Drawing.Point(227, 10);
@@ -382,8 +383,10 @@
this.button60Hz.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.button60Hz.CausesValidation = false;
this.button60Hz.Dock = System.Windows.Forms.DockStyle.Fill;
this.button60Hz.FlatAppearance.BorderColor = System.Drawing.SystemColors.ActiveBorder;
this.button60Hz.FlatAppearance.BorderSize = 0;
this.button60Hz.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button60Hz.ForeColor = System.Drawing.SystemColors.ControlText;
this.button60Hz.Location = new System.Drawing.Point(10, 10);
this.button60Hz.Margin = new System.Windows.Forms.Padding(10);
this.button60Hz.Name = "button60Hz";

View File

@@ -1,5 +1,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Text.Json;
using System.Timers;
namespace GHelper
@@ -57,7 +58,7 @@ namespace GHelper
private void Button120Hz_Click(object? sender, EventArgs e)
{
SetScreen(120, 1);
SetScreen(1000, 1);
}
private void Button60Hz_Click(object? sender, EventArgs e)
@@ -68,22 +69,51 @@ namespace GHelper
public void SetScreen(int frequency = -1, int overdrive = -1)
{
int currentFrequency = NativeMethods.GetRefreshRate();
if (currentFrequency < 0) // Laptop screen not detected or has unknown refresh rate
return;
if (frequency >= 1000)
{
frequency = Program.config.getConfig("max_frequency");
if (frequency <= 60)
frequency = 120;
}
if (frequency > 0)
NativeMethods.SetRefreshRate(frequency);
if (overdrive > 0)
Program.wmi.DeviceSet(ASUSWmi.ScreenOverdrive, overdrive);
InitScreen(frequency, overdrive);
InitScreen();
}
public void InitScreen(int frequency = -1, int overdrive = -1)
public void InitScreen()
{
if (frequency < 0)
frequency = NativeMethods.GetRefreshRate();
int frequency = NativeMethods.GetRefreshRate();
int maxFrequency = Program.config.getConfig("max_frequency");
if (overdrive < 0)
overdrive = Program.wmi.DeviceGet(ASUSWmi.ScreenOverdrive);
if (frequency < 0) {
button60Hz.Enabled= false;
button120Hz.Enabled = false;
labelSreen.Text = "Latop Screen: Turned off";
button60Hz.BackColor = SystemColors.ControlLight;
button120Hz.BackColor = SystemColors.ControlLight;
}
else
{
button60Hz.Enabled = true;
button120Hz.Enabled = true;
button60Hz.BackColor = SystemColors.ControlLightLight;
button120Hz.BackColor = SystemColors.ControlLightLight;
labelSreen.Text = "Latop Screen";
}
int overdrive = Program.wmi.DeviceGet(ASUSWmi.ScreenOverdrive);
button60Hz.FlatAppearance.BorderSize = buttonInactive;
button120Hz.FlatAppearance.BorderSize = buttonInactive;
@@ -91,10 +121,19 @@ namespace GHelper
if (frequency == 60)
{
button60Hz.FlatAppearance.BorderSize = buttonActive;
} else if (frequency == 120)
} else
{
if (maxFrequency > 60)
maxFrequency = frequency;
Program.config.setConfig("max_frequency", maxFrequency);
button120Hz.FlatAppearance.BorderSize = buttonActive;
}
}
if (maxFrequency > 60)
{
button120Hz.Text = maxFrequency.ToString() + "Hz + OD";
}
Program.config.setConfig("frequency", frequency);
Program.config.setConfig("overdrive", overdrive);
@@ -210,7 +249,7 @@ namespace GHelper
if (ScreenAuto != 1) return;
if (Plugged == 1)
SetScreen(120, 1);
SetScreen(1000, 1);
else
SetScreen(60, 0);
@@ -233,25 +272,24 @@ namespace GHelper
{
if (eco == 1 && Plugged == 1) // Eco going Standard on plugged
{
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 0);
GPUMode = ASUSWmi.GPUModeStandard;
VisualiseGPUMode(GPUMode);
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 0);
Program.config.setConfig("gpu_mode", GPUMode);
}
else if (eco == 0 && Plugged == 0) // Standard going Eco on plugged
{
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 1);
GPUMode = ASUSWmi.GPUModeEco;
VisualiseGPUMode(GPUMode);
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 1);
Program.config.setConfig("gpu_mode", GPUMode);
}
}
}
public int InitGPUMode()
{
@@ -400,6 +438,7 @@ namespace GHelper
public void Disable_Ultimate()
{
buttonUltimate.Enabled = false;
buttonUltimate.BackColor = SystemColors.ControlLight;
}
public void SetStartupCheck(bool status)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 KiB

After

Width:  |  Height:  |  Size: 813 KiB