Compare commits

...

42 Commits

Author SHA1 Message Date
Serge
d0f1b70c9f Version bump 2024-09-07 17:47:49 +02:00
Serge
2e025edeb5 Screenpad controls cleanup https://github.com/seerge/g-helper/issues/3067 2024-09-07 17:05:57 +02:00
Serge
c69150f4ef Stop SmartDisplayControl on app start 2024-09-07 16:20:12 +02:00
Serge
0a419ac1f6 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-07 15:04:14 +02:00
Serge
47dcf2a980 Screenpad brightness adjustment values #3067 2024-09-07 15:04:12 +02:00
Serge
1ea3725568 Screenpad brightness tweak https://github.com/seerge/g-helper/issues/3067 2024-09-07 15:03:53 +02:00
Serge
7f44ba0195 Charge limit UI tweaks 2024-09-07 14:00:05 +02:00
Serge
ce01d72db0 Improved Ally Auto Controller mode 2024-09-07 13:56:38 +02:00
Serge
451f290c34 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-06 13:09:14 +02:00
Serge
2c6d8b86a9 Added GU603 to the list without direct RGB settings 2024-09-06 13:09:12 +02:00
Serge
5c7ba8593f New translations strings.resx (Chinese Simplified) (#3069) 2024-09-05 13:21:01 +02:00
Serge
3cb5f3de0e New Crowdin updates (#3068)
* New translations strings.resx (Spanish)

* New translations strings.resx (German)
2024-09-05 10:07:16 +02:00
Serge
c8a6e79144 New Crowdin updates (#3050)
* New translations strings.resx (Ukrainian)

* New translations strings.resx (Turkish)
2024-09-03 23:46:38 +02:00
Serge
6b97bc1eaf Fixed Slash lighting behavior for lid close https://github.com/seerge/g-helper/issues/3054 2024-09-03 20:52:50 +02:00
Serge
0d2fefb8c4 Added units to backlight timeout inputs https://github.com/seerge/g-helper/pull/3037 2024-09-02 10:47:03 +02:00
Serge
acfce9867e New Crowdin updates (#3041)
* New translations strings.resx (German)

* New translations strings.resx (Chinese Simplified)

* New translations strings.resx (German)

* New translations strings.resx (Romanian)

* New translations strings.resx (French)

* New translations strings.resx (Spanish)

* New translations strings.resx (Danish)

* New translations strings.resx (Hungarian)

* New translations strings.resx (Italian)

* New translations strings.resx (Japanese)

* New translations strings.resx (Korean)

* New translations strings.resx (Lithuanian)

* New translations strings.resx (Polish)

* New translations strings.resx (Portuguese)

* New translations strings.resx (Turkish)

* New translations strings.resx (Ukrainian)

* New translations strings.resx (Chinese Traditional)

* New translations strings.resx (Vietnamese)

* New translations strings.resx (Portuguese, Brazilian)

* New translations strings.resx (Indonesian)

* New translations strings.resx (Ukrainian)
2024-09-02 10:34:31 +02:00
Serge
d1e1b6704d Translation Updates 2024-09-02 10:24:12 +02:00
Serge
5913d4fdd7 Merge branch 'main' of https://github.com/seerge/g-helper 2024-09-02 10:10:24 +02:00
Serge
0fd6693434 Skip Visual Mode init command for Vivobook Default setting https://github.com/seerge/g-helper/issues/3046 2024-09-02 10:10:22 +02:00
Ikko Eltociear Ashimine
e96e37a573 docs: add Japanese README (#3047)
I created Japanese translated README.
2024-09-02 09:46:46 +02:00
Serge
58b5221b3c Version bump 2024-08-31 11:56:57 +02:00
Serge
0192d59524 UI Tweaks 2024-08-31 11:06:42 +02:00
Serge
01cede58b5 UI Tweaks 2024-08-31 10:42:43 +02:00
Serge
3dbbddfa58 Startup counter 2024-08-31 10:03:16 +02:00
Serge
1b898b44d2 Cleanup 2024-08-31 09:52:48 +02:00
Serge
dc7362dab1 Added AsusPTPService to the stop/start list https://github.com/seerge/g-helper/issues/3031 2024-08-30 19:45:47 +02:00
Serge
cbd4a5e27c Exception handling https://github.com/seerge/g-helper/issues/3029 2024-08-29 23:12:34 +02:00
Serge
5e9b002013 Version bump 2024-08-26 10:03:42 +02:00
Serge
5077c30704 Power limits tweak for GA605 https://github.com/seerge/g-helper/issues/3017 2024-08-26 09:51:04 +02:00
Serge
d6363dee85 Shasl Battery timer refresh interval 2024-08-26 09:48:41 +02:00
Serge
359575d00d Log cleanup 2024-08-26 09:44:41 +02:00
Serge
9dc444fd33 Added ProArt P16 and X13 to OLED List 2024-08-24 20:09:28 +02:00
Serge
a5b8885ff6 Removed unsuppored backlight modes for ProArt X13 https://github.com/seerge/g-helper/issues/2912 2024-08-24 20:07:44 +02:00
Serge
56676005a5 Added Vivobook M550 to OLED list https://github.com/seerge/g-helper/issues/3015 2024-08-24 15:53:18 +02:00
Serge
0e59f9318e Invert FN-Lock for ProArt https://github.com/seerge/g-helper/issues/3012 2024-08-23 22:26:37 +02:00
Serge
21a2dca271 Hardware FN-Lock for ProArt https://github.com/seerge/g-helper/issues/2973 https://github.com/seerge/g-helper/issues/3012 2024-08-23 13:20:58 +02:00
Serge
e265a78b4f ProArt backlight init #2973 2024-08-22 23:31:22 +02:00
Serge
18b6dd794f Merge branch 'main' of https://github.com/seerge/g-helper 2024-08-22 14:18:05 +02:00
Serge
9fd9506177 Ryzen AI 9 undervolting https://github.com/seerge/g-helper/issues/3005 2024-08-22 14:18:02 +02:00
Serge
a30b202022 ProArt backlight init https://github.com/seerge/g-helper/issues/2973 2024-08-22 12:20:32 +02:00
Serge
b9534fdfe5 New translations strings.resx (Chinese Simplified) (#2998) 2024-08-22 12:20:11 +02:00
Serge
cb3bf3ea90 Swap brightness hotkeys for FA706IH https://github.com/seerge/g-helper/issues/3009 2024-08-22 11:30:38 +02:00
47 changed files with 916 additions and 101 deletions

View File

@@ -347,6 +347,7 @@ namespace GHelper.Ally
if (!autoTDP && _mode != ControllerMode.Auto) return;
float fps = amdControl.GetFPS();
int? usage = 0;
if (autoTDP && fpsLimit > 0 && fpsLimit <= 120)
{
@@ -377,7 +378,8 @@ namespace GHelper.Ally
if (_mode == ControllerMode.Auto)
{
ControllerMode newMode = (fps > 0) ? ControllerMode.Gamepad : ControllerMode.Mouse;
if (fps > 0) usage = amdControl.GetiGpuUse();
ControllerMode newMode = (fps > 0 && usage > 15) ? ControllerMode.Gamepad : ControllerMode.Mouse;
if (_applyMode != newMode) _autoCount++;
else _autoCount = 0;
@@ -386,7 +388,7 @@ namespace GHelper.Ally
{
_autoCount = 0;
ApplyMode(newMode);
Logger.WriteLine($"Controller Mode {fps}: {newMode}");
Logger.WriteLine($"Controller Mode (FPS={fps}, USAGE={usage}%): {newMode}");
}
}

View File

@@ -111,9 +111,12 @@ namespace GHelper.AnimeMatrix
deviceSlash.SetEnabled(true);
deviceSlash.Init();
deviceSlash.SetLidMode(false);
switch ((SlashMode)running)
{
case SlashMode.Static:
Logger.WriteLine("Slash: Static");
var custom = AppConfig.GetString("slash_custom");
if (custom is not null && custom.Length > 0)
{
@@ -126,6 +129,7 @@ namespace GHelper.AnimeMatrix
break;
case SlashMode.BatteryLevel:
// call tick to immediately update the pattern
Logger.WriteLine("Slash: Battery Level");
SlashTimer_start();
SlashTimer_tick();
break;
@@ -146,11 +150,6 @@ namespace GHelper.AnimeMatrix
{
bool matrixLid = AppConfig.Is("matrix_lid");
if (deviceSlash is not null)
{
deviceSlash.SetLidMode(true);
}
if (matrixLid || force)
{
Logger.WriteLine($"Matrix LidClosed: {lidClose}");
@@ -278,7 +277,7 @@ namespace GHelper.AnimeMatrix
}
private void SlashTimer_start(int interval = 60000)
private void SlashTimer_start(int interval = 180000)
{
// 100% to 0% in 1hr = 1% every 36 seconds
// 1 bracket every 14.2857 * 36s = 514s ~ 8m 30s

View File

@@ -182,17 +182,17 @@ namespace GHelper.AnimeMatrix
public void SetBatteryPattern(int brightness)
{
SetCustom(GetBatteryPattern(brightness, 100 * (GetBatteryChargePercentage() / AppConfig.Get("charge_limit", 100))));
SetCustom(GetBatteryPattern(brightness, 100 * (GetBatteryChargePercentage() / AppConfig.Get("charge_limit", 100))), null);
}
public void SetCustom(byte[] data)
public void SetCustom(byte[] data, string? log = "Static Data")
{
Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), "Static");
Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), "StaticSettings");
Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), "StaticSave");
Set(CreatePacket([0xD2, 0x02, 0x01, 0x08, 0xAC]), null);
Set(CreatePacket([0xD3, 0x03, 0x01, 0x08, 0xAC, 0xFF, 0xFF, 0x01, 0x05, 0xFF, 0xFF]), null);
Set(CreatePacket([0xD4, 0x00, 0x00, 0x01, 0xAC]), null);
byte[] payload = new byte[] { 0xD3, 0x00, 0x00, 0x07 };
Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), "Static Data");
Set(CreatePacket(payload.Concat(data.Take(7)).ToArray()), log);
}
public void SetOptions(bool status, int brightness = 0, int interval = 0)

View File

@@ -391,10 +391,15 @@ public static class AppConfig
return ContainsModel("Vivobook") || ContainsModel("Zenbook") || ContainsModel("ProArt");
}
public static bool IsHardwareFnLock()
{
return IsVivoZenPro();
}
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC");
return ContainsModel("FA506IH") || ContainsModel("FA506IC") || ContainsModel("FX506LU") || ContainsModel("FX506IC") || ContainsModel("FX506LH") || ContainsModel("FA506IV") || ContainsModel("FA706IC") || ContainsModel("FA706IH");
}
@@ -406,17 +411,17 @@ public static class AppConfig
// G14 2020 has no aura, but media keys instead
public static bool NoAura()
{
return ContainsModel("GA401I") && !ContainsModel("GA401IHR");
return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("HN7306");
}
public static bool MediaKeys()
{
return NoAura() || ContainsModel("G712L");
return (ContainsModel("GA401I") && !ContainsModel("GA401IHR")) || ContainsModel("G712L");
}
public static bool IsSingleColor()
{
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("GA502IU") || ContainsModel("FA617N") || ContainsModel("FA617X");
return ContainsModel("GA401") || ContainsModel("FX517Z") || ContainsModel("FX516P") || ContainsModel("X13") || IsARCNM() || ContainsModel("GA502IU") || ContainsModel("FA617N") || ContainsModel("FA617X") || NoAura();
}
public static bool IsSlash()
@@ -441,7 +446,7 @@ public static class AppConfig
public static bool IsOLED()
{
return ContainsModel("OLED") || IsSlash() || ContainsModel("M7600") || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M350") || ContainsModel("K650") || ContainsModel("UM53") || ContainsModel("K660") || ContainsModel("UX84") || ContainsModel("M650") || ContainsModel("K340") || ContainsModel("K350") || ContainsModel("M140") || ContainsModel("UM340") || ContainsModel("S540") || ContainsModel("M7400") || ContainsModel("N650");
return ContainsModel("OLED") || IsSlash() || ContainsModel("M7600") || ContainsModel("UX64") || ContainsModel("UX34") || ContainsModel("UX53") || ContainsModel("K360") || ContainsModel("X150") || ContainsModel("M350") || ContainsModel("K650") || ContainsModel("UM53") || ContainsModel("K660") || ContainsModel("UX84") || ContainsModel("M650") || ContainsModel("M550") || ContainsModel("K340") || ContainsModel("K350") || ContainsModel("M140") || ContainsModel("UM340") || ContainsModel("S540") || ContainsModel("M7400") || ContainsModel("N650") || ContainsModel("HN7306") || ContainsModel("H7606");
}
public static bool IsNoOverdrive()
@@ -496,7 +501,7 @@ public static class AppConfig
public static bool IsNoDirectRGB()
{
return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || IsSlash();
return ContainsModel("GA503") || ContainsModel("G533Q") || ContainsModel("GU502") || ContainsModel("GU603") || IsSlash();
}
public static bool IsStrixNumpad()
@@ -607,12 +612,12 @@ public static class AppConfig
public static bool IsFanRequired()
{
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA403") || ContainsModel("G634J") || ContainsModel("G834J") || ContainsModel("G614J") || ContainsModel("G814J") || ContainsModel("FX507V");
return ContainsModel("GA402X") || ContainsModel("G513") || ContainsModel("G713R") || ContainsModel("G713P") || ContainsModel("GU605") || ContainsModel("GA605") || ContainsModel("GA403") || ContainsModel("G634J") || ContainsModel("G834J") || ContainsModel("G614J") || ContainsModel("G814J") || ContainsModel("FX507V");
}
public static bool IsAMDLight()
{
return ContainsModel("GA402X") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X");
return ContainsModel("GA402X") || ContainsModel("GA605") || ContainsModel("GA403") || ContainsModel("FA507N") || ContainsModel("FA507X") || ContainsModel("FA707N") || ContainsModel("FA707X");
}
public static bool IsPowerRequired()

View File

@@ -38,8 +38,9 @@ namespace GHelper.Battery
if (AppConfig.IsChargeLimit6080())
{
if (limit > 80) limit = 100;
if (limit > 85) limit = 100;
else if (limit < 60) limit = 60;
else limit = 80;
}
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");

View File

@@ -16,7 +16,10 @@ namespace GHelper.Display
var modes = new DISPLAYCONFIG_MODE_INFO[modeCount];
err = QueryDisplayConfig(QDC.QDC_ONLY_ACTIVE_PATHS, ref pathCount, paths, ref modeCount, modes, IntPtr.Zero);
if (err != 0)
throw new Win32Exception(err);
{
Logger.WriteLine("HDR Detection Error: " + new Win32Exception(err).Message);
return false;
}
string internalName = AppConfig.GetString("internal_display");

View File

@@ -224,7 +224,7 @@ namespace GHelper.Display
public static void SetVisual(SplendidCommand mode = SplendidCommand.Default, int whiteBalance = DefaultColorTemp, bool init = false)
{
if (mode == SplendidCommand.None) return;
if (mode == SplendidCommand.Default && init) return; // Skip default setting on init
if ((mode == SplendidCommand.Default || mode == SplendidCommand.VivoNormal) && init) return; // Skip default setting on init
if (!forceVisual && ScreenCCD.GetHDRStatus(true)) return;
if (!forceVisual && ScreenNative.GetRefreshRate(ScreenNative.FindLaptopScreen(true)) < 0) return;

15
app/Extra.Designer.cs generated
View File

@@ -73,8 +73,8 @@ namespace GHelper
labelBacklightTitle = new Label();
panelBacklight = new Panel();
panelBacklightExtra = new Panel();
numericBacklightPluggedTime = new NumericUpDown();
numericBacklightTime = new NumericUpDown();
numericBacklightPluggedTime = new NumericUpDownWithUnit();
numericBacklightTime = new NumericUpDownWithUnit();
labelBacklightTimeout = new Label();
labelSpeed = new Label();
comboKeyboardSpeed = new RComboBox();
@@ -119,7 +119,7 @@ namespace GHelper
checkStatusLed = new CheckBox();
checkPerKeyRGB = new CheckBox();
panelPower = new Panel();
numericHibernateAfter = new NumericUpDown();
numericHibernateAfter = new NumericUpDownWithUnit();
labelHibernateAfter = new Label();
pictureHibernate = new PictureBox();
toolTip = new ToolTip(components);
@@ -715,6 +715,7 @@ namespace GHelper
numericBacklightPluggedTime.Name = "numericBacklightPluggedTime";
numericBacklightPluggedTime.Size = new Size(140, 39);
numericBacklightPluggedTime.TabIndex = 1;
numericBacklightPluggedTime.Unit = "sec";
//
// numericBacklightTime
//
@@ -725,6 +726,7 @@ namespace GHelper
numericBacklightTime.Name = "numericBacklightTime";
numericBacklightTime.Size = new Size(140, 39);
numericBacklightTime.TabIndex = 2;
numericBacklightTime.Unit = "sec";
//
// labelBacklightTimeout
//
@@ -1323,6 +1325,7 @@ namespace GHelper
numericHibernateAfter.Maximum = new decimal(new int[] { 3000000, 0, 0, 0 });
numericHibernateAfter.Name = "numericHibernateAfter";
numericHibernateAfter.Size = new Size(152, 39);
numericHibernateAfter.Unit = "min";
numericHibernateAfter.TabIndex = 1;
//
// labelHibernateAfter
@@ -1714,8 +1717,8 @@ namespace GHelper
private Panel panelBacklightHeader;
private Panel panelBacklight;
private Panel panelBacklightExtra;
private NumericUpDown numericBacklightPluggedTime;
private NumericUpDown numericBacklightTime;
private NumericUpDownWithUnit numericBacklightPluggedTime;
private NumericUpDownWithUnit numericBacklightTime;
private Label labelBacklightTimeout;
private Label labelSpeed;
private RComboBox comboKeyboardSpeed;
@@ -1764,7 +1767,7 @@ namespace GHelper
private Panel panelPower;
private PictureBox pictureHibernate;
private Label labelHibernateAfter;
private NumericUpDown numericHibernateAfter;
private NumericUpDownWithUnit numericHibernateAfter;
private CheckBox checkGPUFix;
private ToolTip toolTip;
private CheckBox checkBootSound;

View File

@@ -15,7 +15,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.185</AssemblyVersion>
<AssemblyVersion>0.188</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -119,6 +119,18 @@ public class AmdGpuControl : IGpuControl
}
public int? GetiGpuUse()
{
if (_adlContextHandle == nint.Zero || _iGPU == null) return null;
if (ADL2_New_QueryPMLogData_Get(_adlContextHandle, ((ADLAdapterInfo)_iGPU).AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS) return null;
ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_INFO_ACTIVITY_GFX];
if (gpuUsage.Supported == 0) return null;
return gpuUsage.Value;
}
public int? GetGpuPower()
{
if (_adlContextHandle == nint.Zero || _iGPU == null) return null;

View File

@@ -20,6 +20,8 @@ namespace GHelper.Helpers
"AsusCertService"
};
//"AsusPTPService",
static List<string> processesAC = new() {
"ArmouryCrateSE.Service",
"ArmouryCrate.Service",

View File

@@ -85,8 +85,7 @@ namespace GHelper.Input
InitBacklightTimer();
if (AppConfig.IsVivoZenbook())
Program.acpi.DeviceSet(AsusACPI.FnLock, AppConfig.Is("fn_lock") ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
if (AppConfig.IsHardwareFnLock()) HardwareFnLock(AppConfig.Is("fn_lock"));
}
@@ -155,7 +154,7 @@ namespace GHelper.Input
// FN-Lock group
if (AppConfig.Is("fn_lock") && !AppConfig.IsVivoZenbook())
if (AppConfig.Is("fn_lock") && !AppConfig.IsHardwareFnLock())
for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);
// Arrow-lock group
@@ -629,13 +628,19 @@ namespace GHelper.Input
Program.toast.RunToast("Arrow-Lock " + (arLock == 1 ? Properties.Strings.On : Properties.Strings.Off), ToastIcon.FnLock);
}
public static void HardwareFnLock(bool fnLock)
{
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E, fnLock ? (byte)0x00 : (byte)0x01], "USB FnLock");
}
public static void ToggleFnLock()
{
bool fnLock = !AppConfig.Is("fn_lock");
AppConfig.Set("fn_lock", fnLock ? 1 : 0);
if (AppConfig.IsVivoZenbook())
Program.acpi.DeviceSet(AsusACPI.FnLock, fnLock ^ AppConfig.IsInvertedFNLock() ? 1 : 0, "FnLock");
if (AppConfig.IsHardwareFnLock())
HardwareFnLock(fnLock);
else
Program.settingsForm.BeginInvoke(Program.inputDispatcher.RegisterKeys);
@@ -931,7 +936,7 @@ namespace GHelper.Input
private static System.Threading.Timer screenpadActionTimer;
private static int screenpadBrightnessToSet;
public static void ApplyScreenpadAction(int brightness, bool doToggle = false)
public static void ApplyScreenpadAction(int brightness, bool instant = true)
{
var delay = AppConfig.Get("screenpad_delay", 1500);
@@ -939,11 +944,12 @@ namespace GHelper.Input
Action<int> action = (b) =>
{
if (b >= 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 1, "ScreenpadOn");
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, Math.Max(b * 255 / 100, 0), "Screenpad");
int[] brightnessValues = [0, 4, 9, 14, 21, 32, 48, 73, 111, 169, 255];
Program.acpi.DeviceSet(AsusACPI.ScreenPadBrightness, brightnessValues[Math.Min(brightnessValues.Length - 1, Math.Max(0, b / 10))], "Screenpad");
if (b < 0) Program.acpi.DeviceSet(AsusACPI.ScreenPadToggle, 0, "ScreenpadOff");
};
if(delay <= 0 || (brightness > 0 && brightness < 100 && doToggle == false)) //instant action
if(delay <= 0 || instant) //instant action
{
action(brightness);
}
@@ -969,20 +975,19 @@ namespace GHelper.Input
if (brightness < 0) brightness = 100;
else if (brightness >= 100) brightness = 0;
else brightness = -10;
ApplyScreenpadAction(brightness, false);
}
else
{
brightness = Math.Max(Math.Min(100, brightness + delta), -10);
brightness = Math.Max(Math.Min(100, brightness + delta), 0);
ApplyScreenpadAction(brightness);
}
AppConfig.Set("screenpad", brightness);
ApplyScreenpadAction(brightness);
string toast;
if (brightness < 0) toast = "Off";
else if (brightness == 0) toast = "Hidden";
else toast = brightness.ToString() + "%";
Program.toast.RunToast($"Screen Pad {toast}", delta > 0 ? ToastIcon.BrightnessUp : ToastIcon.BrightnessDown);

View File

@@ -30,6 +30,7 @@ namespace GHelper
labelScaling.Text = Properties.Strings.ScalingQuality;
labelRotation.Text = Properties.Strings.ImageRotation;
labelContrastTitle.Text = Properties.Strings.Contrast;
labelGammaTitle.Text = Properties.Strings.Brightness;
buttonPicture.Text = Properties.Strings.PictureGif;
buttonReset.Text = Properties.Strings.Reset;

View File

@@ -69,6 +69,10 @@ namespace GHelper
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (ProcessHelper.IsUserAdministrator() ? "." : ""));
var startCount = AppConfig.Get("start_count") + 1;
AppConfig.Set("start_count", startCount);
Logger.WriteLine("Start Count: " + startCount);
acpi = new AsusACPI();
if (!acpi.IsConnected() && AppConfig.IsASUS())
@@ -83,6 +87,8 @@ namespace GHelper
return;
}
ProcessHelper.KillByName("ASUSSmartDisplayControl");
Application.EnableVisualStyles();
HardwareControl.RecreateGpuControl();

View File

@@ -771,6 +771,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Donate.
/// </summary>
internal static string Donate {
get {
return ResourceManager.GetString("Donate", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Download Color Profiles.
/// </summary>
@@ -1196,6 +1205,42 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Legend.
/// </summary>
internal static string Legend {
get {
return ResourceManager.GetString("Legend", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Can&apos;t check local version.
/// </summary>
internal static string LegendGray {
get {
return ResourceManager.GetString("LegendGray", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Updated.
/// </summary>
internal static string LegendGreen {
get {
return ResourceManager.GetString("LegendGreen", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Update Available.
/// </summary>
internal static string LegendRed {
get {
return ResourceManager.GetString("LegendRed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Lid.
/// </summary>
@@ -1575,7 +1620,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to Switch to Eco on battery and to Standard when plugged.
/// Looks up a localized string similar to Switch to Eco on battery and to Standard when plugged in.
/// </summary>
internal static string OptimizedGPUTooltip {
get {
@@ -1935,7 +1980,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to .
/// Looks up a localized string similar to Touchscreen.
/// </summary>
internal static string Touchscreen {
get {

View File

@@ -744,7 +744,7 @@ Vil du stadig fortsætte?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Vil du stadig fortsætte?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Trotzdem fortfahren?</value>
<value>Touchscreen umschalten</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -783,7 +783,7 @@ Trotzdem fortfahren?</value>
<value>Darstellungsmodi sind nicht verfügbar, wenn HDR aktiv ist.</value>
</data>
<data name="VisualModesScreen" xml:space="preserve">
<value>Darstellungsmodi sind nicht verfügbar, wenn Laptop-Bildschirm aus ist.</value>
<value>Modi nicht verfügbar, wenn Laptop-Bildschirm aus ist.</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Lautstärke verringern</value>
@@ -800,4 +800,22 @@ Trotzdem fortfahren?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Spenden</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legende</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Kann lokale Version nicht überprüfen</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update verfügbar</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Aktuell</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Alternar pantalla táctil</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Pantalla táctil</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donar</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Leyenda</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>No se puede comprobar la versión local</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Actualización disponible</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Actualizado</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Voulez-vous continuer ?</value>
<value>Activer/désactiver l'écran tactile</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Voulez-vous continuer ?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Érintőképernyő ki-/bekapcsolása</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbó</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Apakah Anda masih ingin melanjutkan?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Apakah Anda masih ingin melanjutkan?</value>
<data name="Zoom" xml:space="preserve">
<value>Perbesar</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Sei sicuro di voler continuare?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Sei sicuro di voler continuare?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>터보</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>확대/축소</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Vis tiek norite tęsti?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Vis tiek norite tęsti?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Nadal chcesz kontynuować?</value>
<value>Włącz/wyłącz ekran dotykowy</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Nadal chcesz kontynuować?</value>
<data name="Zoom" xml:space="preserve">
<value>Przybliżenie</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Quer prosseguir?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Quer prosseguir?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value />
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Dokunmatik Ekranı Değiştir</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Dokunmatik ekran</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Yine de devam etmek istiyor musunuz?</value>
<data name="Zoom" xml:space="preserve">
<value>Yakınlaştır</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Bağış</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Gösterge</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Yerel sürüm denetlenemiyor</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Güncelleme Mevcut</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Güncellendi</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -316,7 +316,7 @@
<value>Чорно-біла іконка трею</value>
</data>
<data name="Calibrate" xml:space="preserve">
<value>Калібрування</value>
<value>Калібр.</value>
</data>
<data name="Charging" xml:space="preserve">
<value>Зарядка</value>
@@ -744,7 +744,7 @@
<value>Сенсорний екран</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Сенсорний екран</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Турбо</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>Зум</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Донат</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Легенда</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Немає даних</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Є оновлення</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Оновлено</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@ Do you still want to continue?</value>
<value>Toggle Touchscreen</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -800,4 +800,22 @@ Do you still want to continue?</value>
<data name="Zoom" xml:space="preserve">
<value>Zoom</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -741,10 +741,10 @@
<value>关闭屏幕</value>
</data>
<data name="ToggleTouchscreen" xml:space="preserve">
<value>Toggle Touchscreen</value>
<value>切换触摸屏</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>触摸屏</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>增强模式</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>缩放</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>赞助</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>无法检查本地版本</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>有可用更新</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>已更新</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -744,7 +744,7 @@
<value>切換螢幕觸控</value>
</data>
<data name="Touchscreen" xml:space="preserve">
<value/>
<value>Touchscreen</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>極速</value>
@@ -800,4 +800,22 @@
<data name="Zoom" xml:space="preserve">
<value>縮放</value>
</data>
</root>
<data name="Donate" xml:space="preserve">
<value>Donate</value>
</data>
<data name="Legend" xml:space="preserve">
<value>Legend</value>
</data>
<data name="LegendGray" xml:space="preserve">
<value>Can't check local version</value>
<comment>Can't check local version</comment>
</data>
<data name="LegendRed" xml:space="preserve">
<value>Update Available</value>
<comment>Update Available</comment>
</data>
<data name="LegendGreen" xml:space="preserve">
<value>Updated</value>
<comment>Updated</comment>
</data>
</root>

View File

@@ -40,7 +40,7 @@ namespace Ryzen
//PHEONIX - 9
//RAPHAEL/DRAGON RANGE - 10
//MENDOCINO - 11
//HAWKPOINT - 12
//HAWKPOINT/STRIXPOINT - 12
public static void Init()
{
@@ -77,7 +77,7 @@ namespace Ryzen
FAMID = 1; //PICASSO
}
if (CPUModel.Contains("Model " + Convert.ToString(32)))
if (CPUModel.Contains("Family " + Convert.ToString(23)) && CPUModel.Contains("Model " + Convert.ToString(32)))
{
FAMID = 2; //DALI
}
@@ -127,6 +127,11 @@ namespace Ryzen
FAMID = 12; //HAWKPOINT
}
if (CPUModel.Contains("Family " + Convert.ToString(26)) && CPUModel.Contains("Model " + Convert.ToString(36)))
{
FAMID = 12; //STRIXPOINT
}
Logger.WriteLine($"CPU: {FAMID} - {CPUName} - {CPUModel}");
SetAddresses();
@@ -141,7 +146,7 @@ namespace Ryzen
public static bool IsSupportedUV()
{
if (CPUName.Length == 0) Init();
return CPUName.Contains("Ryzen 9") || CPUName.Contains("4900H") || CPUName.Contains("4800H") || CPUName.Contains("4600H");
return CPUName.Contains("Ryzen AI 9") || CPUName.Contains("Ryzen 9") || CPUName.Contains("4900H") || CPUName.Contains("4800H") || CPUName.Contains("4600H");
}
public static bool IsSupportedUViGPU()

View File

@@ -21,7 +21,7 @@ namespace Ryzen
//PHEONIX - 9
//RAPHAEL/DRAGON RANGE - 10
//MENDOCINO - 11
//HAWKPOINT - 12
//HAWKPOINT/STRIXPOINT - 12
public static Smu RyzenAccess = new Smu(false);
public static int FAMID = RyzenControl.FAMID;

View File

@@ -93,6 +93,7 @@ namespace GHelper
buttonMatrix.Text = Properties.Strings.PictureGif;
buttonQuit.Text = Properties.Strings.Quit;
buttonUpdates.Text = Properties.Strings.Updates;
buttonDonate.Text = Properties.Strings.Donate;
buttonController.Text = Properties.Strings.Controller;
labelAlly.Text = Properties.Strings.AllyController;
@@ -270,6 +271,12 @@ namespace GHelper
labelCharge.Click += LabelCharge_Click;
buttonDonate.Click += ButtonDonate_Click;
if (AppConfig.Get("start_count") > 10 && !AppConfig.Is("donate_click"))
{
buttonDonate.BorderColor = colorTurbo;
buttonDonate.Badge = true;
}
labelDynamicLighting.Click += LabelDynamicLighting_Click;
@@ -279,6 +286,8 @@ namespace GHelper
private void ButtonDonate_Click(object? sender, EventArgs e)
{
AppConfig.Set("donate_click", 1);
buttonDonate.Badge = false;
Process.Start(new ProcessStartInfo("https://github.com/seerge/g-helper/wiki/Support-Project") { UseShellExecute = true });
}

View File

@@ -0,0 +1,141 @@
using System.Globalization;
using System.Text.RegularExpressions;
public class NumericUpDownWithUnit : NumericUpDown
{
#region| Fields |
private string unit = null;
private bool unitFirst = false;
#endregion
#region| Properties |
public string Unit
{
get => unit;
set
{
unit = value;
UpdateEditText();
}
}
public bool UnitFirst
{
get => unitFirst;
set
{
unitFirst = value;
UpdateEditText();
}
}
#endregion
#region| Methods |
/// <summary>
/// Method called when updating the numeric updown text.
/// </summary>
protected override void UpdateEditText()
{
// If there is a unit we handle it ourselfs, if there is not we leave it to the base class.
if (Unit != null && Unit != string.Empty)
{
if (UnitFirst)
{
Text = $"({Unit}) {Value}";
}
else
{
Text = $"{Value} ({Unit})";
}
}
else
{
base.UpdateEditText();
}
}
/// <summary>
/// Validate method called before actually updating the text.
/// This is exactly the same as the base class but it will use the new ParseEditText from this class instead.
/// </summary>
protected override void ValidateEditText()
{
// See if the edit text parses to a valid decimal considering the label unit
ParseEditText();
UpdateEditText();
}
/// <summary>
/// Converts the text displayed in the up-down control to a numeric value and evaluates it.
/// </summary>
protected new void ParseEditText()
{
try
{
// The only difference of this methods to the base one is that text is replaced directly
// with the property Text instead of using the regex.
// We now that the only characters that may be on the textbox are from the unit we provide.
// because the NumericUpDown handles invalid input from user for us.
// This is where the magic happens. This regex will match all characters from the unit
// (so your unit cannot have numbers). You can change this regex to fill your needs
var regex = new Regex($@"[^(?!{Unit} )]+");
var match = regex.Match(Text);
if (match.Success)
{
var text = match.Value;
// VSWhidbey 173332: Verify that the user is not starting the string with a "-"
// before attempting to set the Value property since a "-" is a valid character with
// which to start a string representing a negative number.
if (!string.IsNullOrEmpty(text) && !(text.Length == 1 && text == "-"))
{
if (Hexadecimal)
{
Value = Constrain(Convert.ToDecimal(Convert.ToInt32(Text, 16)));
}
else
{
Value = Constrain(Decimal.Parse(text, CultureInfo.CurrentCulture));
}
}
}
}
catch
{
// Leave value as it is
}
finally
{
UserEdit = false;
}
}
/// </summary>
/// Returns the provided value constrained to be within the min and max.
/// This is exactly the same as the one in base class (which is private so we can't directly use it).
/// </summary>
private decimal Constrain(decimal value)
{
if (value < Minimum)
{
value = Minimum;
}
if (value > Maximum)
{
value = Maximum;
}
return value;
}
#endregion
}

View File

@@ -52,6 +52,16 @@ namespace GHelper.UI
}
}
private bool badge = false;
public bool Badge
{
get { return badge; }
set
{
badge = value;
}
}
public RButton()
{
DoubleBuffered = true;
@@ -99,6 +109,15 @@ namespace GHelper.UI
pevent.Graphics.DrawPath(penBorder, pathBorder);
}
if (badge)
{
using (Brush brush = new SolidBrush(borderColor))
{
var radius = ratio * 10;
pevent.Graphics.FillEllipse(brush, rectSurface.Width - rectSurface.Height / 2 - radius, rectSurface.Height / 2 - radius, radius + radius, radius + radius);
}
}
if (!Enabled && ForeColor != SystemColors.ControlText)
{
var rect = pevent.ClipRectangle;

View File

@@ -268,6 +268,16 @@ namespace GHelper.USB
Encoding.ASCII.GetBytes("]ASUS Tech.Inc."),
new byte[] { AsusHid.AURA_ID, 0x05, 0x20, 0x31, 0, 0x1A },
}, "Init");
if (AppConfig.IsProArt())
{
AsusHid.WriteInput([AsusHid.INPUT_ID, 0x05, 0x20, 0x31, 0x00, 0x08], "ProArt Init");
//AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xBA, 0xC5, 0xC4], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x8F, 0x01], "ProArt Init");
AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x85, 0xFF], "ProArt Init");
//AsusHid.WriteInput([AsusHid.INPUT_ID, 0xD0, 0x4E], "ProArt Init");
}
}

View File

@@ -78,7 +78,7 @@ namespace GHelper
// labelBIOS
//
labelBIOS.AutoSize = true;
labelBIOS.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBIOS.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelBIOS.Location = new Point(68, 23);
labelBIOS.Margin = new Padding(4, 0, 4, 0);
labelBIOS.Name = "labelBIOS";
@@ -113,7 +113,7 @@ namespace GHelper
// labelUpdates
//
labelUpdates.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelUpdates.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelUpdates.Location = new Point(864, 19);
labelUpdates.Name = "labelUpdates";
labelUpdates.Size = new Size(302, 32);
@@ -125,6 +125,7 @@ namespace GHelper
buttonRefresh.Activated = false;
buttonRefresh.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonRefresh.BackColor = SystemColors.ControlLight;
buttonRefresh.Badge = false;
buttonRefresh.BorderColor = Color.Transparent;
buttonRefresh.BorderRadius = 5;
buttonRefresh.FlatAppearance.BorderSize = 0;
@@ -192,7 +193,7 @@ namespace GHelper
// labelDrivers
//
labelDrivers.AutoSize = true;
labelDrivers.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelDrivers.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelDrivers.Location = new Point(68, 6);
labelDrivers.Margin = new Padding(4, 0, 4, 0);
labelDrivers.Name = "labelDrivers";
@@ -280,7 +281,7 @@ namespace GHelper
//
labelLegend.AutoSize = true;
labelLegend.Dock = DockStyle.Top;
labelLegend.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelLegend.Font = new Font("Segoe UI", 9F, FontStyle.Bold);
labelLegend.Location = new Point(20, 10);
labelLegend.Margin = new Padding(10);
labelLegend.Name = "labelLegend";

View File

@@ -49,6 +49,11 @@ namespace GHelper
labelBIOS.Text = "BIOS";
labelDrivers.Text = Properties.Strings.DriverAndSoftware;
labelLegend.Text = Properties.Strings.Legend;
labelLegendGray.Text = Properties.Strings.LegendGray;
labelLegendRed.Text = Properties.Strings.LegendRed;
labelLegendGreen.Text = Properties.Strings.LegendGreen;
SuspendLayout();
tableBios.Visible = false;

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@@ -48,7 +48,7 @@
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter

181
docs/README.ja-JP.md Normal file
View File

@@ -0,0 +1,181 @@
# G-Helper - Asusートパソコン用の軽量コントロールツール
[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)
[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup>
Asusートパソコン用の軽量なArmoury Crate代替ツールで、余分な負荷や不要なサービスなしでほぼ同じ機能を提供します。
ROG Zephyrus G14、G15、G16、M16、Flow X13、Flow X16、Flow Z13、TUFシリーズ、StrixまたはScarシリーズ、ProArt、Vivobook、Zenbook、ROG Ally / Ally Xなど、すべての人気モデルで動作します
# [:floppy_disk:ダウンロード](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
**⭐ アプリが気に入ったら、ぜひオンラインで広めてください**
<table>
<tr>
<td><b>プロジェクトをサポート</b></td>
<td >
<a href="https://bit.ly/4c0ZWs9"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-eur.png" height="36" alt="PayPal EUR"></a>&nbsp;
<a href="https://bit.ly/4aGTyW8"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/paypal-usd.png" height="36" alt="PayPal USD"></a>&nbsp;
<a href="https://buy.stripe.com/8wM6pt8HbgK50tWbIK"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/stripe.png" height="36" alt="Stripe"></a>&nbsp;
<a href="https://buy.stripe.com/6oE29dg9D3Xj7Wo28b"><img src="https://raw.githubusercontent.com/seerge/g-helper/main/docs/alipay.png" height="36" alt="Alipay"></a>
</td>
</tr>
</table>
- [FAQ](https://github.com/seerge/g-helper/wiki/FAQ)
- [セットアップと要件](https://github.com/seerge/g-helper/wiki/Requirements)
- [トラブルシューティング](https://github.com/seerge/g-helper/wiki/Troubleshooting)
- [パワーユーザー設定](https://github.com/seerge/g-helper/wiki/Power-user-settings)
[![G-Helper Download](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
## :loudspeaker: YouTubeレビューとガイド
| [![Youtube review Josh Cravey](https://i.ytimg.com/vi/hqe-PjuE-K8/hqdefault.jpg)](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [![Youtube review cbutters Tech](https://i.ytimg.com/vi/6aVdwJKZSSc/hqdefault.jpg)](https://www.youtube.com/watch?v=6aVdwJKZSSc) |
| ----------------- | ---------------- |
| [Josh Cravey](https://www.youtube.com/watch?v=hqe-PjuE-K8) | [cbutters Tech](https://www.youtube.com/watch?v=6aVdwJKZSSc) |
## 📰 記事
1. https://www.digitaltrends.com/computing/g-helper-armoury-crate-alternative/
2. https://binaryfork.com/ghelper-armoury-crate-alternative-10216/
## :gift: 利点
1. シームレスで自動的なGPU切り替え
2. すべてのパフォーマンスモードを電力制限とファンカーブで完全にカスタマイズ可能
3. 軽量。システムに何もインストールしません。実行するための単一のexeファイルのみ
4. シンプルでクリーンなネイティブUIで、すべての設定に簡単にアクセス
5. FNロックとカスタムホットキー
![Screenshot 2024-03-11 104354](https://github.com/seerge/g-helper/assets/5920850/626a5a6e-fdae-431c-843e-92886c8420ee)
### :zap: 機能
1. パフォーマンスモード: サイレント - バランス - ターボ (内蔵、デフォルトのファンカーブ付き)
2. GPUモード: エコ - スタンダード - アルティメット - オプティマイズド
3. ディスプレイのリフレッシュレート制御とディスプレイオーバードライブ (OD)
4. カスタムファンカーブエディタ、電力制限、ターボブースト選択
5. アニメマトリックスまたはスラッシュライティングの制御、アニメーションGIF、時計、オーディオビジュアライザー
6. バックライトのアニメーションモードとカラー
7. ホットキーの処理
8. CPUとGPUの温度、ファン速度、バッテリーステータスの監視
9. バッテリーの充電制限
10. NVidia GPUのオーバークロックとアンダーボルティング
11. XG Mobileの制御
12. AMD CPUのアンダーボルティング
13. BIOSとドライバの更新
14. Asusマウスの設定
15. ミニLEDのマルチゾーンスイッチ
16. フリッカーフリーディミングとビジュアルモード
### :gear: 自動化
- バッテリー使用時または電源接続時のパフォーマンスモードの切り替え
- オプティマイズドGPUモード - バッテリー使用時にdGPUを無効化し、電源接続時に有効化
- 自動ディスプレイリフレッシュレート (バッテリー使用時に60Hz、電源接続時に最大Hz)
- バッテリー使用時または電源接続時のキーボードバックライトのタイムアウト
### :rocket: パフォーマンスモード
<img align="right" width="300" src="https://github.com/seerge/g-helper/assets/5920850/3e119674-db8d-486b-aa65-2bf9b61f9aa6">
すべてのモードはBIOSに組み込まれており、デフォルトのファンカーブと電力制限が設定されています。これらはArmoury Crateと同じです。
各BIOSモードは対応するWindowsパワーモードとペアになっています。これを「ファン + 電源」設定で調整できます。
1. BIOSの「サイレント」 + Windowsの「最高の電力効率」パワーモード
2. BIOSの「バランス」 (AC時のパフォーマンス) + Windowsの「バランス」パワーモード
3. BIOSの「ターボ」 + Windowsの「最高のパフォーマンス」パワーモード
### :video_game: GPUモード
1. エコ: 低電力の統合GPUのみが有効、iGPUが内蔵ディスプレイを駆動
2. スタンダード (MS Hybrid): iGPUとdGPUが有効、iGPUが内蔵ディスプレイを駆動
3. アルティメット: iGPUとdGPUが有効、dGPUが内蔵ディスプレイを駆動 (2022年以降のモデルでサポート)
4. オプティマイズド: バッテリー使用時にdGPUを無効化 (エコ)し、電源接続時に有効化 (スタンダード)
![Screenshot 2024-03-11 111818](https://github.com/seerge/g-helper/assets/5920850/fd69a81e-978d-4d5c-a0a8-26da51f90a5b)
![GPU Modes](https://github.com/seerge/g-helper/assets/5920850/65c6bdd5-728c-4965-b544-fcf5a85ed6a2)
### :mouse: Asusマウスとその他の周辺機器のサポート
[現在サポートされているモデル](https://github.com/seerge/g-helper/discussions/900)
- ROG Chakram X (P708)
- ROG Chakram Core (P511)
- ROG Gladius II and Gladius II Origin (P502 and P504)
- ROG Gladius II Wireless
- ROG Gladius III
- ROG Gladius III Wireless
- ROG Harpe Ace Aim Lab Edition
- ROG Keris Wireless
- ROG Keris II Ace
- ROG Strix Carry (P508)
- ROG Strix III Gladius III Aimpoint Wireless (P711)
- ROG Strix Impact III (P518)
- ROG Spatha X
- ROG Strix Impact II Wireless
- ROG Pugio
- ROG Pugio II
- TUF Gaming M4 Wireless (P306)
- TUF Gaming M3
- TUF Gaming M3 Gen II
- TUF Gaming M4 AIR
- TUF Gaming M5
- TX Gaming Mini
[@IceStormNG](https://github.com/IceStormNG) 👑 の貢献と研究に大いに感謝します。
### ⌨️ キーバインディング
- ``Fn + F5 / Fn + Shift + F5`` - パフォーマンスモードを前方/後方に切り替え
- ``Ctrl + Shift + F5 / Ctrl + Shift + Alt + F5`` - パフォーマンスモードを前方/後方に切り替え
- ``Ctrl + Shift + F12`` - G-Helperウィンドウを開く
- ``Ctrl + M1 / M2`` - ディスプレイの明るさを下げる/上げる
- ``Shift + M1 / M2`` - バックライトの明るさを下げる/上げる
- ``Fn + C`` - Fnロック
- ``Fn + Ctrl + F7 / F8`` - フリッカーフリーディミングを下げる/上げる
- ``Fn + Shift + F7 / F8`` - マトリックス/スラッシュライティングの明るさを下げる/上げる
- ``Fn + Shift + F7 / F8`` - スクリーンパッドの明るさを下げる/上げる
- ``Ctrl + Shift + F20`` - マイクをミュート
- ``Ctrl + Shift + Alt + F13`` - ディスプレイのリフレッシュレートを切り替え
- ``Ctrl + Shift + Alt + F14`` - エコGPUモード
- ``Ctrl + Shift + Alt + F15`` - スタンダードGPUモード
- ``Ctrl + Shift + Alt + F16`` - サイレント
- ``Ctrl + Shift + Alt + F17`` - バランス
- ``Ctrl + Shift + Alt + F18`` - ターボ
- ``Ctrl + Shift + Alt + F19`` - カスタム1 (存在する場合)
- ``Ctrl + Shift + Alt + F20`` - カスタム2 (存在する場合)
- [カスタムキーバインディング/ホットキー](https://github.com/seerge/g-helper/wiki/Power-user-settings#custom-hotkey-actions)
### 🎮ROG Allyバインディング
- ``M + DPad Left / Right`` - ディスプレイの明るさ
- ``M + DPad Up`` - タッチキーボード
- ``M + DPad Down`` - デスクトップを表示
- ``M + Y`` - AMDオーバーレイを切り替え
- ``M + X`` - スクリーンショット
- ``M + Right Stick Click`` - コントローラーモード
------------------
### 🔖 重要な注意事項
G-Helperはオペレーティングシステム、ファームウェア、またはドライバではありません。ハードウェアをリアルタイムで「実行」することはありません。
これは、製造元が作成し、BIOSに保存されている事前定義された操作モードの1つを選択し、オプションでいくつかの設定を行うアプリケーションです。Armoury Crateと同じように機能します。Asus System Control Interface「ドライバ」を使用してすべての機能を実現します。
Armoury Crateと同じモード/設定を使用する場合、デバイスのパフォーマンスや動作に違いはありません。
G-Helperの役割は、リモコンがテレビに対して果たす役割に似ています。
### 使用ライブラリとプロジェクト
- [Linux Kernel](https://github.com/torvalds/linux/blob/master/include/linux/platform_data/x86/asus-wmi.h) - ASUS ACPI/WMIインターフェースの基本エンドポイント
- [NvAPIWrapper](https://github.com/falahati/NvAPIWrapper) - Nvidia APIへのアクセス
- [Starlight](https://github.com/vddCore/Starlight) - アニメマトリックス通信プロトコル
- [UXTU](https://github.com/JamesCJ60/Universal-x86-Tuning-Utility) - Ryzen System Management Unitを使用したアンダーボルティング
- [AsusCtl](https://gitlab.com/asus-linux/asusctl) - インスピレーションと逆アセンブル
### 免責事項
"Asus"、"ROG"、"TUF"、および"Armoury Crate"は、AsusTek Computer, Inc.の商標であり、AsusTek Computerに属する資産に対して一切の権利を主張しません。これらの資産は純粋に情報提供の目的で使用されています。
ソフトウェアは「現状のまま」提供され、明示または黙示のいかなる保証もなく、商品性、特定の目的への適合性、および非侵害の保証を含みますが、これに限定されません。このソフトウェアの誤用は、システムの不安定性や誤動作を引き起こす可能性があります。

View File

@@ -1,7 +1,7 @@
# G-Helper - Lightweight control tool for Asus laptops
[![United24](https://raw.githubusercontent.com/seerge/g-helper/main/docs/ua.png)](https://u24.gov.ua/)
[![GitHub release](https://img.shields.io/github/release/seerge/g-helper)](https://GitHub.com/seerge/g-helper/releases/)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup>
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/) <sup>[中文版点这里](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)</sup> <sup>[日本語はこちら](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)</sup>
Small and lightweight Armoury Crate alternative for Asus laptops offering almost same functionality without extra load and unnecessary services.

View File

@@ -4,7 +4,7 @@
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social)](https://GitHub.com/seerge/g-helper/stargazers/)
语言: [English](https://github.com/seerge/g-helper#readme) | 中文
语言: [English](https://github.com/seerge/g-helper#readme) | 中文 | [日本語](https://github.com/seerge/g-helper/blob/main/docs/README.ja-JP.md)
适用于华硕Asus笔记本电脑的轻量级 Armoury Crate (奥创控制中心)替代品,在功能几乎相同的同时减少不必要的服务以减轻负载。
G-helper兼容所有主流型号例如 ROG 幻14、幻15、幻16、幻13、幻X、天选飞行堡垒系列、枪神/魔霸系列、创系列、灵耀系列、无畏系列、ROG Ally 等!