Compare commits

...

49 Commits
v0.69 ... v0.75

Author SHA1 Message Date
Serge
314d25c751 Backlight fix 2023-06-01 15:24:51 +02:00
Serge
b52163949c Auto brightness tweak 2023-06-01 15:18:41 +02:00
Serge
f0ee2b8aac Fn-lock support for optimization service 2023-06-01 14:32:29 +02:00
Serge
1603f625ed FN-Lock support for case when optimization service is running 2023-06-01 14:19:43 +02:00
Serge
8f66006791 Fn-lock tweaks 2023-06-01 12:52:35 +02:00
Serge
39387041fe UI fixes 2023-05-31 17:41:24 +02:00
Serge
400b2cd6cb FN-lock 2023-05-31 17:33:53 +02:00
Serge
b20442e61f Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-31 17:23:54 +02:00
Serge
6d219511fc FN-Lock preparations 2023-05-31 17:23:52 +02:00
Serge
2282820453 Merge pull request #491 from marcelomijas/main
Spanish translation small fix
2023-05-31 11:51:11 +02:00
Marcelo Moreno
d4fcfe8895 Spanish translation small fix
Added translations for keyboard backlight timeout but they were too large... This is a shorter translation.
2023-05-31 11:36:13 +02:00
Serge
8eb923a703 PPT labels 2023-05-30 22:43:42 +02:00
Serge
59548be543 PPT UI tweaks 2023-05-30 21:35:21 +02:00
Serge
1596ce84e8 PPT labels fixes 2023-05-30 18:58:44 +02:00
Serge
f670b9e0dc Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-30 14:55:52 +02:00
Serge
52c2987c88 UI tweaks 2023-05-30 14:55:50 +02:00
Serge
c9aa910035 Merge pull request #485 from marcelomijas/main
Update Spanish translation
2023-05-30 12:19:58 +02:00
Marcelo Moreno
22f648a23f Update Spanish translation 2023-05-30 12:18:31 +02:00
Serge
9255a8554d Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-30 00:33:27 +02:00
Serge
859f4f55c3 GPU sliders fix 2023-05-30 00:33:24 +02:00
Serge
7e3872939b Update README.md 2023-05-29 23:54:59 +02:00
Serge
2556583451 Update README.md 2023-05-29 23:53:19 +02:00
Serge
20e7d220e5 Added APU slider 2023-05-29 22:07:08 +02:00
Serge
2f5543ce84 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-29 19:39:00 +02:00
Serge
4c55e16f2e UI tweaks 2023-05-29 19:38:57 +02:00
Serge
30544e74d7 Update README.md 2023-05-29 19:18:25 +02:00
Serge
f5925accb3 Merge pull request #475 from MDowski/patch-2
Update to Polish translation
2023-05-29 15:31:29 +02:00
MD
842ea2a92d Update to Polish translation
Tweaks in declination and words shortening.
2023-05-29 14:58:37 +02:00
Serge
1ca97bd3f4 Updated translations 2023-05-29 14:36:55 +02:00
Serge
8a1dd9f137 Bumped version number 2023-05-29 13:15:54 +02:00
Serge
325f16cf55 Added optimization service to debloat.bat 2023-05-29 13:15:23 +02:00
Serge
42cc1bdb98 Added option to stop all GPU apps before setting Eco 2023-05-29 12:16:19 +02:00
Serge
83a2d1dc9f Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-28 21:43:26 +02:00
Serge
3aae223b15 Added Ctr+Shif+F12 binding to toggle app window 2023-05-28 21:43:24 +02:00
Serge
b22d2f8ceb Update README.md 2023-05-28 21:26:05 +02:00
Serge
2041861a14 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-28 16:09:46 +02:00
Serge
dfc3c0e515 UI tweaks 2023-05-28 16:09:44 +02:00
Serge
796ec34284 Update README.md 2023-05-28 14:06:12 +02:00
Serge
50894a59d3 USB adjustment 2023-05-28 12:15:43 +02:00
Serge
1472004d4b Backlight timeouts 2023-05-28 12:02:29 +02:00
Serge
36c42ed05f Merge pull request #468 from etylix/main
Add Vietnamese translations
2023-05-28 11:45:04 +02:00
Hoang Pham Anh Duy
66220351f1 Add Vietnamese translations 2023-05-28 16:40:49 +07:00
Serge
8f2c8842e0 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-27 22:44:55 +02:00
Serge
1cda822820 Backlight control fix 2023-05-27 22:44:54 +02:00
Serge
2afba74dd5 Update README.md 2023-05-26 11:52:29 +02:00
Serge
e69f9d1014 Update README.md 2023-05-26 11:48:13 +02:00
Serge
47d96aca61 Keybinding fix 2023-05-25 13:30:33 +02:00
Serge
f36fb6ca55 Hide GPU fans from UI if they don't exist in system 2023-05-24 23:47:08 +02:00
Serge
e765b4f037 Tweaks and fixes 2023-05-24 14:34:43 +02:00
29 changed files with 2280 additions and 601 deletions

View File

@@ -60,7 +60,7 @@ public static class AppConfig
{
GetModel();
return (_model is not null && _model.Contains(contains));
return (_model is not null && _model.ToLower().Contains(contains.ToLower()));
}
private static void initConfig()
@@ -71,11 +71,11 @@ public static class AppConfig
File.WriteAllText(configFile, jsonString);
}
public static int getConfig(string name)
public static int getConfig(string name, int empty = -1)
{
if (config.ContainsKey(name))
return int.Parse(config[name].ToString());
else return -1;
else return empty;
}
public static bool isConfig(string name)
@@ -83,11 +83,11 @@ public static class AppConfig
return getConfig(name) == 1;
}
public static string getConfigString(string name)
public static string getConfigString(string name, string empty = null)
{
if (config.ContainsKey(name))
return config[name].ToString();
else return null;
else return empty;
}
public static void setConfig(string name, int value)

View File

@@ -1,4 +1,4 @@
using System.Diagnostics;
using GHelper;
using System.Management;
using System.Runtime.InteropServices;
@@ -66,16 +66,16 @@ public class AsusACPI
public const int Temp_CPU = 0x00120094;
public const int Temp_GPU = 0x00120097;
public const int PPT_TotalA0 = 0x001200A0; // Total PPT on 2022 (PPT_LIMIT_SLOW ) and CPU PPT on 2021
public const int PPT_TotalA0 = 0x001200A0; // SPL (Total limit for all-AMD models)
public const int PPT_EDCA1 = 0x001200A1; // CPU EDC
public const int PPT_TDCA2 = 0x001200A2; // CPU TDC
public const int PPT_APUA3 = 0x001200A3; // APU PPT ON 2021, doesn't work on 2022
public const int PPT_APUA3 = 0x001200A3; // sPPT (long boost limit)
public const int PPT_CPUB0 = 0x001200B0; // CPU PPT on 2022 (PPT_LIMIT_APU)
public const int PPT_CPUB1 = 0x001200B1; // Total PPT on 2022 (PPT_LIMIT_SLOW)
public const int PPT_GPUC0 = 0x001200C0; // NVIDIA GPU Boost
public const int PPT_APUC1 = 0x001200C1; // Actual Power Limit (PPT_LIMIT_FAST) AND Sustained Power Limit (STAPM_LIMIT)
public const int PPT_APUC1 = 0x001200C1; // fPPT (fast boost limit)
public const int PPT_GPUC2 = 0x001200C2; // NVIDIA GPU Temp Target (75.. 87 C)
public const int TUF_KB_BRIGHTNESS = 0x00050021;
@@ -83,6 +83,7 @@ public class AsusACPI
public const int TUF_KB_STATE = 0x00100057;
public const int TabletState = 0x00060077;
public const int FnLock = 0x00100023;
public const int Tablet_Notebook = 0;
public const int Tablet_Tablet = 1;
@@ -171,8 +172,8 @@ public class AsusACPI
data[0] = BitConverter.GetBytes(eventHandle.ToInt32())[0];
data[1] = BitConverter.GetBytes(eventHandle.ToInt32())[1];
result = Control(0x222400, data, outBuffer);
Logger.WriteLine("ACPI " + result + ":" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));
Control(0x222400, data, outBuffer);
Logger.WriteLine("ACPI :" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));
while (true)
{
@@ -203,10 +204,11 @@ public class AsusACPI
}
public bool Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
{
uint lpBytesReturned = 0;
return DeviceIoControl(
DeviceIoControl(
handle,
dwIoControlCode,
lpInBuffer,
@@ -413,6 +415,11 @@ public class AsusACPI
return DeviceGet(GPUXGConnected) == 1;
}
public bool IsAllAmdPPT()
{
return DeviceGet(PPT_CPUB0) >= 0 && DeviceGet(PPT_GPUC0) < 0;
}
public void TUFKeyboardBrightness(int brightness)
{
int param = 0x80 | (brightness & 0x7F);

View File

@@ -1,5 +1,4 @@
using HidLibrary;
using Microsoft.Win32;
using System.Text;
namespace GHelper
@@ -125,6 +124,10 @@ namespace GHelper
_modes.Remove(3);
}
if (AppConfig.ContainsModel("G513")) {
return _modes;
}
if (AppConfig.ContainsModel("Strix") || AppConfig.ContainsModel("Scar"))
{
return _modesStrix;
@@ -175,13 +178,13 @@ namespace GHelper
}
private static IEnumerable<HidDevice> GetHidDevices(int[] deviceIds, int minInput = 18)
private static IEnumerable<HidDevice> GetHidDevices(int[] deviceIds, int minInput = 18, int minFeatures = 1)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
foreach (HidDevice device in HidDeviceList)
if (device.IsConnected
&& device.Capabilities.FeatureReportByteLength > 0
&& device.Capabilities.InputReportByteLength >= minInput)
&& device.Capabilities.FeatureReportByteLength >= minFeatures
&& device.Capabilities.InputReportByteLength >= minInput)
yield return device;
}
@@ -248,23 +251,42 @@ namespace GHelper
public static void ApplyBrightness(int brightness)
{
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
Task.Run(async () =>
{
byte[] msg = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
Logger.WriteLine("KB Backlight:" + BitConverter.ToString(msg));
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
var devices = GetHidDevices(deviceIds, 0);
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(msg);
Logger.WriteLine("KB Backlight:" + BitConverter.ToString(msg));
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
// Backup payload for old models
if (AppConfig.ContainsModel("503"))
{
byte[] msgBackup = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
var devicesBackup = GetHidDevices(deviceIds, 0);
foreach (HidDevice device in devicesBackup)
{
device.OpenDevice();
device.WriteFeatureData(msgBackup);
device.CloseDevice();
}
}
});
}
@@ -294,49 +316,6 @@ namespace GHelper
}
public static int SetXGM(byte[] msg)
{
//Logger.WriteLine("XGM Payload :" + BitConverter.ToString(msg));
var payload = new byte[300];
Array.Copy(msg, payload, msg.Length);
foreach (HidDevice device in GetHidDevices(new int[] { 0x1970 }, 0))
{
device.OpenDevice();
Logger.WriteLine("XGM " + device.Attributes.ProductHexId + "|" + device.Capabilities.FeatureReportByteLength + ":" + BitConverter.ToString(msg));
device.WriteFeatureData(payload);
device.CloseDevice();
return 1;
}
return 0;
}
public static void ApplyXGMLight(bool status)
{
SetXGM(new byte[] { 0x5e, 0xc5, status ? (byte)0x50 : (byte)0 });
}
public static int ResetXGM()
{
return SetXGM(new byte[] { 0x5e, 0xd1, 0x02 });
}
public static int SetXGMFan(byte[] curve)
{
if (AsusACPI.IsInvalidCurve(curve)) return -1;
byte[] msg = new byte[19];
Array.Copy(new byte[] { 0x5e, 0xd1, 0x01 }, msg, 3);
Array.Copy(curve, 0, msg, 3, curve.Length);
return SetXGM(msg);
}
public static void ApplyAura()
{
@@ -381,21 +360,49 @@ namespace GHelper
}
public static void SetBacklightOffDelay(int value = 60)
// Reference : thanks to https://github.com/RomanYazvinsky/ for initial discovery of XGM payloads
public static int SetXGM(byte[] msg)
{
try
//Logger.WriteLine("XGM Payload :" + BitConverter.ToString(msg));
var payload = new byte[300];
Array.Copy(msg, payload, msg.Length);
foreach (HidDevice device in GetHidDevices(new int[] { 0x1970 }, 0, 300))
{
RegistryKey myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ASUS\ASUS System Control Interface\AsusOptimization\ASUS Keyboard Hotkeys", true);
if (myKey != null)
{
myKey.SetValue("TurnOffKeybdLight", value, RegistryValueKind.DWord);
myKey.Close();
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
device.OpenDevice();
Logger.WriteLine("XGM " + device.Attributes.ProductHexId + "|" + device.Capabilities.FeatureReportByteLength + ":" + BitConverter.ToString(msg));
device.WriteFeatureData(payload);
device.CloseDevice();
//return 1;
}
return 0;
}
public static void ApplyXGMLight(bool status)
{
SetXGM(new byte[] { 0x5e, 0xc5, status ? (byte)0x50 : (byte)0 });
}
public static int ResetXGM()
{
return SetXGM(new byte[] { 0x5e, 0xd1, 0x02 });
}
public static int SetXGMFan(byte[] curve)
{
if (AsusACPI.IsInvalidCurve(curve)) return -1;
byte[] msg = new byte[19];
Array.Copy(new byte[] { 0x5e, 0xd1, 0x01 }, msg, 3);
Array.Copy(curve, 0, msg, 3, curve.Length);
return SetXGM(msg);
}

71
app/Extra.Designer.cs generated
View File

@@ -51,6 +51,8 @@ namespace GHelper
pictureHelp = new PictureBox();
groupLight = new GroupBox();
panelBacklightExtra = new Panel();
numericBacklightPluggedTime = new NumericUpDown();
labelBacklightTimeoutPlugged = new Label();
numericBacklightTime = new NumericUpDown();
labelBacklightTimeout = new Label();
labelBrightness = new Label();
@@ -81,6 +83,8 @@ namespace GHelper
checkSleepLid = new CheckBox();
checkShutdownLid = new CheckBox();
groupOther = new GroupBox();
checkFnLock = new CheckBox();
checkGpuApps = new CheckBox();
checkAutoApplyWindowsPowerMode = new CheckBox();
checkKeyboardAuto = new CheckBox();
checkUSBC = new CheckBox();
@@ -91,6 +95,7 @@ namespace GHelper
((System.ComponentModel.ISupportInitialize)pictureHelp).BeginInit();
groupLight.SuspendLayout();
panelBacklightExtra.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericBacklightPluggedTime).BeginInit();
((System.ComponentModel.ISupportInitialize)numericBacklightTime).BeginInit();
((System.ComponentModel.ISupportInitialize)trackBrightness).BeginInit();
panelXMG.SuspendLayout();
@@ -302,13 +307,15 @@ namespace GHelper
groupLight.Dock = DockStyle.Top;
groupLight.Location = new Point(10, 334);
groupLight.Name = "groupLight";
groupLight.Size = new Size(954, 516);
groupLight.Size = new Size(954, 563);
groupLight.TabIndex = 1;
groupLight.TabStop = false;
groupLight.Text = "Keyboard Backlight";
//
// panelBacklightExtra
//
panelBacklightExtra.Controls.Add(numericBacklightPluggedTime);
panelBacklightExtra.Controls.Add(labelBacklightTimeoutPlugged);
panelBacklightExtra.Controls.Add(numericBacklightTime);
panelBacklightExtra.Controls.Add(labelBacklightTimeout);
panelBacklightExtra.Controls.Add(labelBrightness);
@@ -318,9 +325,25 @@ namespace GHelper
panelBacklightExtra.Dock = DockStyle.Top;
panelBacklightExtra.Location = new Point(3, 319);
panelBacklightExtra.Name = "panelBacklightExtra";
panelBacklightExtra.Size = new Size(948, 194);
panelBacklightExtra.Size = new Size(948, 241);
panelBacklightExtra.TabIndex = 43;
//
// numericBacklightPluggedTime
//
numericBacklightPluggedTime.Location = new Point(655, 181);
numericBacklightPluggedTime.Maximum = new decimal(new int[] { 3600, 0, 0, 0 });
numericBacklightPluggedTime.Name = "numericBacklightPluggedTime";
numericBacklightPluggedTime.Size = new Size(240, 39);
numericBacklightPluggedTime.TabIndex = 49;
//
// labelBacklightTimeoutPlugged
//
labelBacklightTimeoutPlugged.Location = new Point(13, 183);
labelBacklightTimeoutPlugged.Name = "labelBacklightTimeoutPlugged";
labelBacklightTimeoutPlugged.Size = new Size(636, 45);
labelBacklightTimeoutPlugged.TabIndex = 48;
labelBacklightTimeoutPlugged.Text = "Seconds to turn off backlight when plugged";
//
// numericBacklightTime
//
numericBacklightTime.Location = new Point(655, 133);
@@ -662,23 +685,46 @@ namespace GHelper
//
// groupOther
//
groupOther.Controls.Add(checkFnLock);
groupOther.Controls.Add(checkGpuApps);
groupOther.Controls.Add(checkAutoApplyWindowsPowerMode);
groupOther.Controls.Add(checkKeyboardAuto);
groupOther.Controls.Add(checkUSBC);
groupOther.Controls.Add(checkNoOverdrive);
groupOther.Controls.Add(checkTopmost);
groupOther.Dock = DockStyle.Top;
groupOther.Location = new Point(10, 850);
groupOther.Location = new Point(10, 897);
groupOther.Name = "groupOther";
groupOther.Size = new Size(954, 276);
groupOther.Size = new Size(954, 352);
groupOther.TabIndex = 2;
groupOther.TabStop = false;
groupOther.Text = "Other";
//
// checkFnLock
//
checkFnLock.AutoSize = true;
checkFnLock.Location = new Point(25, 89);
checkFnLock.MaximumSize = new Size(780, 0);
checkFnLock.Name = "checkFnLock";
checkFnLock.Size = new Size(397, 36);
checkFnLock.TabIndex = 49;
checkFnLock.Text = "Process Fn+F hotkeys without Fn";
checkFnLock.UseVisualStyleBackColor = true;
//
// checkGpuApps
//
checkGpuApps.AutoSize = true;
checkGpuApps.Location = new Point(25, 128);
checkGpuApps.Name = "checkGpuApps";
checkGpuApps.Size = new Size(544, 36);
checkGpuApps.TabIndex = 48;
checkGpuApps.Text = "Stop all apps using GPU when switching to Eco";
checkGpuApps.UseVisualStyleBackColor = true;
//
// checkAutoApplyWindowsPowerMode
//
checkAutoApplyWindowsPowerMode.AutoSize = true;
checkAutoApplyWindowsPowerMode.Location = new Point(25, 220);
checkAutoApplyWindowsPowerMode.Location = new Point(25, 296);
checkAutoApplyWindowsPowerMode.Name = "checkAutoApplyWindowsPowerMode";
checkAutoApplyWindowsPowerMode.Size = new Size(416, 36);
checkAutoApplyWindowsPowerMode.TabIndex = 47;
@@ -688,7 +734,7 @@ namespace GHelper
// checkKeyboardAuto
//
checkKeyboardAuto.AutoSize = true;
checkKeyboardAuto.Location = new Point(25, 40);
checkKeyboardAuto.Location = new Point(25, 50);
checkKeyboardAuto.MaximumSize = new Size(780, 0);
checkKeyboardAuto.Name = "checkKeyboardAuto";
checkKeyboardAuto.Size = new Size(712, 36);
@@ -699,7 +745,7 @@ namespace GHelper
// checkUSBC
//
checkUSBC.AutoSize = true;
checkUSBC.Location = new Point(25, 85);
checkUSBC.Location = new Point(25, 170);
checkUSBC.Name = "checkUSBC";
checkUSBC.Size = new Size(659, 36);
checkUSBC.TabIndex = 4;
@@ -709,7 +755,7 @@ namespace GHelper
// checkNoOverdrive
//
checkNoOverdrive.AutoSize = true;
checkNoOverdrive.Location = new Point(25, 130);
checkNoOverdrive.Location = new Point(25, 212);
checkNoOverdrive.Name = "checkNoOverdrive";
checkNoOverdrive.Size = new Size(307, 36);
checkNoOverdrive.TabIndex = 3;
@@ -719,7 +765,7 @@ namespace GHelper
// checkTopmost
//
checkTopmost.AutoSize = true;
checkTopmost.Location = new Point(25, 175);
checkTopmost.Location = new Point(25, 254);
checkTopmost.Name = "checkTopmost";
checkTopmost.Size = new Size(390, 36);
checkTopmost.TabIndex = 1;
@@ -732,7 +778,7 @@ namespace GHelper
AutoScaleMode = AutoScaleMode.Font;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(974, 1131);
ClientSize = new Size(974, 1262);
Controls.Add(groupOther);
Controls.Add(groupLight);
Controls.Add(groupBindings);
@@ -754,6 +800,7 @@ namespace GHelper
groupLight.PerformLayout();
panelBacklightExtra.ResumeLayout(false);
panelBacklightExtra.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericBacklightPluggedTime).EndInit();
((System.ComponentModel.ISupportInitialize)numericBacklightTime).EndInit();
((System.ComponentModel.ISupportInitialize)trackBrightness).EndInit();
panelXMG.ResumeLayout(false);
@@ -822,5 +869,9 @@ namespace GHelper
private RComboBox comboM2;
private TextBox textM2;
private TextBox textM1;
private NumericUpDown numericBacklightPluggedTime;
private Label labelBacklightTimeoutPlugged;
private CheckBox checkGpuApps;
private CheckBox checkFnLock;
}
}

View File

@@ -1,4 +1,5 @@
using CustomControls;
using Microsoft.VisualBasic.Devices;
using System.Diagnostics;
namespace GHelper
@@ -84,19 +85,24 @@ namespace GHelper
labelSpeed.Text = Properties.Strings.AnimationSpeed;
labelBrightness.Text = Properties.Strings.Brightness;
labelBacklightTimeout.Text = Properties.Strings.BacklightTimeout;
labelBacklightTimeoutPlugged.Text = Properties.Strings.BacklightTimeoutPlugged;
checkKeyboardAuto.Text = Properties.Strings.KeyboardAuto;
checkNoOverdrive.Text = Properties.Strings.DisableOverdrive;
checkTopmost.Text = Properties.Strings.WindowTop;
checkUSBC.Text = Properties.Strings.OptimizedUSBC;
checkAutoApplyWindowsPowerMode.Text = Properties.Strings.ApplyWindowsPowerPlan;
checkFnLock.Text = Properties.Strings.FnLock;
labelBacklight.Text = Properties.Strings.Keyboard;
labelBacklightBar.Text = Properties.Strings.Lightbar;
labelBacklightLid.Text = Properties.Strings.Lid;
labelBacklightLogo.Text = Properties.Strings.Logo;
checkGpuApps.Text = Properties.Strings.KillGpuApps;
Text = Properties.Strings.ExtraSettings;
InitTheme();
@@ -209,18 +215,38 @@ namespace GHelper
checkXMG.Checked = !(AppConfig.getConfig("xmg_light") == 0);
checkXMG.CheckedChanged += CheckXMG_CheckedChanged;
int kb_timeout = AppConfig.getConfig("keyboard_light_tiomeout");
numericBacklightTime.Value = (kb_timeout >= 0) ? kb_timeout : 60;
numericBacklightTime.Value = AppConfig.getConfig("keyboard_timeout", 60);
numericBacklightPluggedTime.Value = AppConfig.getConfig("keyboard_ac_timeout", 0);
numericBacklightTime.ValueChanged += NumericBacklightTime_ValueChanged;
numericBacklightPluggedTime.ValueChanged += NumericBacklightTime_ValueChanged;
checkGpuApps.Checked = AppConfig.isConfig("kill_gpu_apps");
checkGpuApps.CheckedChanged += CheckGpuApps_CheckedChanged;
checkFnLock.Checked = AppConfig.isConfig("fn_lock");
checkFnLock.CheckedChanged += CheckFnLock_CheckedChanged; ;
}
private void CheckFnLock_CheckedChanged(object? sender, EventArgs e)
{
int fnLock = checkFnLock.Checked ? 1 : 0;
AppConfig.setConfig("fn_lock", fnLock);
Program.acpi.DeviceSet(AsusACPI.FnLock, (fnLock == 1) ? 0 : 1, "FnLock");
Program.inputDispatcher.RegisterKeys();
}
private void CheckGpuApps_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.setConfig("kill_gpu_apps", (checkGpuApps.Checked ? 1 : 0));
}
private void NumericBacklightTime_ValueChanged(object? sender, EventArgs e)
{
Program.RunAsAdmin("extra");
AppConfig.setConfig("keyboard_light_tiomeout", (int)numericBacklightTime.Value);
AsusUSB.SetBacklightOffDelay((int)numericBacklightTime.Value);
AppConfig.setConfig("keyboard_timeout", (int)numericBacklightTime.Value);
AppConfig.setConfig("keyboard_ac_timeout", (int)numericBacklightPluggedTime.Value);
Program.inputDispatcher.InitBacklightTimer();
}
private void CheckXMG_CheckedChanged(object? sender, EventArgs e)

368
app/Fans.Designer.cs generated
View File

@@ -31,14 +31,14 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
ChartArea chartArea9 = new ChartArea();
Title title9 = new Title();
ChartArea chartArea10 = new ChartArea();
Title title10 = new Title();
ChartArea chartArea11 = new ChartArea();
Title title11 = new Title();
ChartArea chartArea12 = new ChartArea();
Title title12 = new Title();
ChartArea chartArea5 = new ChartArea();
Title title5 = new Title();
ChartArea chartArea6 = new ChartArea();
Title title6 = new Title();
ChartArea chartArea7 = new ChartArea();
Title title7 = new Title();
ChartArea chartArea8 = new ChartArea();
Title title8 = new Title();
panelFans = new Panel();
labelTip = new Label();
tableFanCharts = new TableLayoutPanel();
@@ -60,14 +60,18 @@ namespace GHelper
panelApplyPower = new Panel();
checkApplyPower = new RCheckBox();
labelInfo = new Label();
panelCPU = new Panel();
labelCPU = new Label();
label2 = new Label();
trackCPU = new TrackBar();
panelTotal = new Panel();
labelTotal = new Label();
labelPlatform = new Label();
trackTotal = new TrackBar();
panelB0 = new Panel();
labelB0 = new Label();
labelLeftB0 = new Label();
trackB0 = new TrackBar();
panelC1 = new Panel();
labelC1 = new Label();
labelLeftC1 = new Label();
trackC1 = new TrackBar();
panelA0 = new Panel();
labelA0 = new Label();
labelLeftA0 = new Label();
trackA0 = new TrackBar();
panelTitleCPU = new Panel();
pictureBox1 = new PictureBox();
labelPowerLimits = new Label();
@@ -103,10 +107,12 @@ namespace GHelper
panelSliders.SuspendLayout();
panelPower.SuspendLayout();
panelApplyPower.SuspendLayout();
panelCPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();
panelTotal.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();
panelB0.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackB0).BeginInit();
panelC1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackC1).BeginInit();
panelA0.SuspendLayout();
((System.ComponentModel.ISupportInitialize)trackA0).BeginInit();
panelTitleCPU.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
panelGPU.SuspendLayout();
@@ -137,7 +143,7 @@ namespace GHelper
panelFans.MinimumSize = new Size(815, 0);
panelFans.Name = "panelFans";
panelFans.Padding = new Padding(0, 0, 10, 0);
panelFans.Size = new Size(815, 1189);
panelFans.Size = new Size(815, 1310);
panelFans.TabIndex = 12;
//
// labelTip
@@ -170,65 +176,65 @@ namespace GHelper
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.Size = new Size(805, 1007);
tableFanCharts.Size = new Size(805, 1128);
tableFanCharts.TabIndex = 36;
//
// chartGPU
//
chartArea9.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea9);
chartArea5.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea5);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(12, 259);
chartGPU.Location = new Point(12, 289);
chartGPU.Margin = new Padding(2, 10, 2, 10);
chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(781, 229);
chartGPU.Size = new Size(781, 259);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title9.Name = "Title1";
chartGPU.Titles.Add(title9);
title5.Name = "Title1";
chartGPU.Titles.Add(title5);
//
// chartCPU
//
chartArea10.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea10);
chartArea6.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea6);
chartCPU.Dock = DockStyle.Fill;
chartCPU.Location = new Point(12, 10);
chartCPU.Margin = new Padding(2, 10, 2, 10);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(781, 229);
chartCPU.Size = new Size(781, 259);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title10.Name = "Title1";
chartCPU.Titles.Add(title10);
title6.Name = "Title1";
chartCPU.Titles.Add(title6);
//
// chartXGM
//
chartArea11.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea11);
chartArea7.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea7);
chartXGM.Dock = DockStyle.Fill;
chartXGM.Location = new Point(12, 757);
chartXGM.Location = new Point(12, 847);
chartXGM.Margin = new Padding(2, 10, 2, 10);
chartXGM.Name = "chartXGM";
chartXGM.Size = new Size(781, 230);
chartXGM.Size = new Size(781, 261);
chartXGM.TabIndex = 14;
chartXGM.Text = "chartXGM";
title11.Name = "Title4";
chartXGM.Titles.Add(title11);
title7.Name = "Title4";
chartXGM.Titles.Add(title7);
chartXGM.Visible = false;
//
// chartMid
//
chartArea12.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea12);
chartArea8.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea8);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(12, 508);
chartMid.Location = new Point(12, 568);
chartMid.Margin = new Padding(2, 10, 2, 10);
chartMid.Name = "chartMid";
chartMid.Size = new Size(781, 229);
chartMid.Size = new Size(781, 259);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title12.Name = "Title3";
chartMid.Titles.Add(title12);
title8.Name = "Title3";
chartMid.Titles.Add(title8);
chartMid.Visible = false;
//
// panelTitleFans
@@ -295,7 +301,7 @@ namespace GHelper
panelApplyFans.Controls.Add(checkApplyFans);
panelApplyFans.Controls.Add(buttonReset);
panelApplyFans.Dock = DockStyle.Bottom;
panelApplyFans.Location = new Point(0, 1073);
panelApplyFans.Location = new Point(0, 1194);
panelApplyFans.Name = "panelApplyFans";
panelApplyFans.Size = new Size(805, 116);
panelApplyFans.TabIndex = 43;
@@ -337,7 +343,7 @@ namespace GHelper
buttonReset.Margin = new Padding(4, 2, 4, 2);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(232, 54);
buttonReset.Size = new Size(274, 54);
buttonReset.TabIndex = 18;
buttonReset.Text = Properties.Strings.FactoryDefaults;
buttonReset.UseVisualStyleBackColor = false;
@@ -351,7 +357,7 @@ namespace GHelper
panelSliders.Margin = new Padding(0);
panelSliders.Name = "panelSliders";
panelSliders.Padding = new Padding(10, 0, 0, 0);
panelSliders.Size = new Size(533, 1189);
panelSliders.Size = new Size(533, 1310);
panelSliders.TabIndex = 13;
//
// panelPower
@@ -360,20 +366,21 @@ namespace GHelper
panelPower.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelPower.Controls.Add(panelApplyPower);
panelPower.Controls.Add(labelInfo);
panelPower.Controls.Add(panelCPU);
panelPower.Controls.Add(panelTotal);
panelPower.Controls.Add(panelB0);
panelPower.Controls.Add(panelC1);
panelPower.Controls.Add(panelA0);
panelPower.Controls.Add(panelTitleCPU);
panelPower.Dock = DockStyle.Fill;
panelPower.Location = new Point(10, 652);
panelPower.Name = "panelPower";
panelPower.Size = new Size(523, 537);
panelPower.Size = new Size(523, 658);
panelPower.TabIndex = 43;
//
// panelApplyPower
//
panelApplyPower.Controls.Add(checkApplyPower);
panelApplyPower.Dock = DockStyle.Bottom;
panelApplyPower.Location = new Point(0, 447);
panelApplyPower.Location = new Point(0, 568);
panelApplyPower.Name = "panelApplyPower";
panelApplyPower.Padding = new Padding(10);
panelApplyPower.Size = new Size(523, 90);
@@ -396,7 +403,7 @@ namespace GHelper
// labelInfo
//
labelInfo.Dock = DockStyle.Top;
labelInfo.Location = new Point(0, 342);
labelInfo.Location = new Point(0, 482);
labelInfo.Margin = new Padding(4, 0, 4, 0);
labelInfo.Name = "labelInfo";
labelInfo.Padding = new Padding(5);
@@ -404,105 +411,155 @@ namespace GHelper
labelInfo.TabIndex = 43;
labelInfo.Text = "Experimental Feature";
//
// panelCPU
// panelB0
//
panelCPU.AutoSize = true;
panelCPU.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelCPU.Controls.Add(labelCPU);
panelCPU.Controls.Add(label2);
panelCPU.Controls.Add(trackCPU);
panelCPU.Dock = DockStyle.Top;
panelCPU.Location = new Point(0, 206);
panelCPU.Margin = new Padding(4);
panelCPU.Name = "panelCPU";
panelCPU.Size = new Size(523, 136);
panelCPU.TabIndex = 41;
panelB0.AutoSize = true;
panelB0.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelB0.Controls.Add(labelB0);
panelB0.Controls.Add(labelLeftB0);
panelB0.Controls.Add(trackB0);
panelB0.Dock = DockStyle.Top;
panelB0.Location = new Point(0, 346);
panelB0.Margin = new Padding(4);
panelB0.Name = "panelB0";
panelB0.Size = new Size(523, 136);
panelB0.TabIndex = 41;
//
// labelCPU
// labelB0
//
labelCPU.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelCPU.Location = new Point(398, 8);
labelCPU.Margin = new Padding(4, 0, 4, 0);
labelCPU.Name = "labelCPU";
labelCPU.Size = new Size(120, 32);
labelCPU.TabIndex = 13;
labelCPU.Text = "CPU";
labelCPU.TextAlign = ContentAlignment.TopRight;
labelB0.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelB0.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelB0.Location = new Point(398, 8);
labelB0.Margin = new Padding(4, 0, 4, 0);
labelB0.Name = "labelB0";
labelB0.Size = new Size(120, 32);
labelB0.TabIndex = 13;
labelB0.Text = "CPU";
labelB0.TextAlign = ContentAlignment.TopRight;
//
// label2
// labelLeftB0
//
label2.AutoSize = true;
label2.Location = new Point(10, 8);
label2.Margin = new Padding(4, 0, 4, 0);
label2.Name = "label2";
label2.Size = new Size(58, 32);
label2.TabIndex = 12;
label2.Text = "CPU";
labelLeftB0.AutoSize = true;
labelLeftB0.Location = new Point(10, 8);
labelLeftB0.Margin = new Padding(4, 0, 4, 0);
labelLeftB0.Name = "labelLeftB0";
labelLeftB0.Size = new Size(58, 32);
labelLeftB0.TabIndex = 12;
labelLeftB0.Text = "CPU";
//
// trackCPU
// trackB0
//
trackCPU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackCPU.Location = new Point(6, 44);
trackCPU.Margin = new Padding(4, 2, 4, 2);
trackCPU.Maximum = 85;
trackCPU.Minimum = 5;
trackCPU.Name = "trackCPU";
trackCPU.Size = new Size(513, 90);
trackCPU.TabIndex = 11;
trackCPU.TickFrequency = 5;
trackCPU.TickStyle = TickStyle.TopLeft;
trackCPU.Value = 80;
trackB0.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackB0.Location = new Point(6, 44);
trackB0.Margin = new Padding(4, 2, 4, 2);
trackB0.Maximum = 85;
trackB0.Minimum = 5;
trackB0.Name = "trackB0";
trackB0.Size = new Size(513, 90);
trackB0.TabIndex = 11;
trackB0.TickFrequency = 5;
trackB0.TickStyle = TickStyle.TopLeft;
trackB0.Value = 80;
//
// panelTotal
// panelC1
//
panelTotal.AutoSize = true;
panelTotal.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelTotal.Controls.Add(labelTotal);
panelTotal.Controls.Add(labelPlatform);
panelTotal.Controls.Add(trackTotal);
panelTotal.Dock = DockStyle.Top;
panelTotal.Location = new Point(0, 66);
panelTotal.Margin = new Padding(4);
panelTotal.Name = "panelTotal";
panelTotal.Size = new Size(523, 140);
panelTotal.TabIndex = 40;
panelC1.AutoSize = true;
panelC1.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelC1.Controls.Add(labelC1);
panelC1.Controls.Add(labelLeftC1);
panelC1.Controls.Add(trackC1);
panelC1.Dock = DockStyle.Top;
panelC1.Location = new Point(0, 206);
panelC1.Margin = new Padding(4);
panelC1.Name = "panelC1";
panelC1.Size = new Size(523, 140);
panelC1.TabIndex = 45;
//
// labelTotal
// labelC1
//
labelTotal.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelTotal.Location = new Point(396, 10);
labelTotal.Margin = new Padding(4, 0, 4, 0);
labelTotal.Name = "labelTotal";
labelTotal.Size = new Size(122, 32);
labelTotal.TabIndex = 12;
labelTotal.Text = "Platform";
labelTotal.TextAlign = ContentAlignment.TopRight;
labelC1.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelC1.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelC1.Location = new Point(396, 8);
labelC1.Margin = new Padding(4, 0, 4, 0);
labelC1.Name = "labelC1";
labelC1.Size = new Size(119, 32);
labelC1.TabIndex = 13;
labelC1.Text = "APU";
labelC1.TextAlign = ContentAlignment.TopRight;
//
// labelPlatform
// labelLeftC1
//
labelPlatform.AutoSize = true;
labelPlatform.Location = new Point(10, 10);
labelPlatform.Margin = new Padding(4, 0, 4, 0);
labelPlatform.Name = "labelPlatform";
labelPlatform.Size = new Size(104, 32);
labelPlatform.TabIndex = 11;
labelPlatform.Text = "Platform";
labelLeftC1.AutoSize = true;
labelLeftC1.Location = new Point(10, 8);
labelLeftC1.Margin = new Padding(4, 0, 4, 0);
labelLeftC1.Name = "labelLeftC1";
labelLeftC1.Size = new Size(58, 32);
labelLeftC1.TabIndex = 12;
labelLeftC1.Text = "APU";
//
// trackTotal
// trackC1
//
trackTotal.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackTotal.Location = new Point(6, 48);
trackTotal.Margin = new Padding(4, 2, 4, 2);
trackTotal.Maximum = 180;
trackTotal.Minimum = 10;
trackTotal.Name = "trackTotal";
trackTotal.Size = new Size(513, 90);
trackTotal.TabIndex = 10;
trackTotal.TickFrequency = 5;
trackTotal.TickStyle = TickStyle.TopLeft;
trackTotal.Value = 125;
trackC1.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackC1.Location = new Point(6, 48);
trackC1.Margin = new Padding(4, 2, 4, 2);
trackC1.Maximum = 85;
trackC1.Minimum = 5;
trackC1.Name = "trackC1";
trackC1.Size = new Size(513, 90);
trackC1.TabIndex = 11;
trackC1.TickFrequency = 5;
trackC1.TickStyle = TickStyle.TopLeft;
trackC1.Value = 80;
//
// panelA0
//
panelA0.AutoSize = true;
panelA0.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelA0.Controls.Add(labelA0);
panelA0.Controls.Add(labelLeftA0);
panelA0.Controls.Add(trackA0);
panelA0.Dock = DockStyle.Top;
panelA0.Location = new Point(0, 66);
panelA0.Margin = new Padding(4);
panelA0.Name = "panelA0";
panelA0.Size = new Size(523, 140);
panelA0.TabIndex = 40;
//
// labelA0
//
labelA0.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelA0.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelA0.Location = new Point(396, 10);
labelA0.Margin = new Padding(4, 0, 4, 0);
labelA0.Name = "labelA0";
labelA0.Size = new Size(122, 32);
labelA0.TabIndex = 12;
labelA0.Text = "Platform";
labelA0.TextAlign = ContentAlignment.TopRight;
//
// labelLeftA0
//
labelLeftA0.AutoSize = true;
labelLeftA0.Location = new Point(10, 10);
labelLeftA0.Margin = new Padding(4, 0, 4, 0);
labelLeftA0.Name = "labelLeftA0";
labelLeftA0.Size = new Size(104, 32);
labelLeftA0.TabIndex = 11;
labelLeftA0.Text = "Platform";
//
// trackA0
//
trackA0.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackA0.Location = new Point(6, 48);
trackA0.Margin = new Padding(4, 2, 4, 2);
trackA0.Maximum = 180;
trackA0.Minimum = 10;
trackA0.Name = "trackA0";
trackA0.Size = new Size(513, 90);
trackA0.TabIndex = 10;
trackA0.TickFrequency = 5;
trackA0.TickStyle = TickStyle.TopLeft;
trackA0.Value = 125;
//
// panelTitleCPU
//
@@ -785,7 +842,7 @@ namespace GHelper
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(1340, 1189);
ClientSize = new Size(1340, 1310);
Controls.Add(panelFans);
Controls.Add(panelSliders);
Margin = new Padding(4, 2, 4, 2);
@@ -816,12 +873,15 @@ namespace GHelper
panelPower.PerformLayout();
panelApplyPower.ResumeLayout(false);
panelApplyPower.PerformLayout();
panelCPU.ResumeLayout(false);
panelCPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();
panelTotal.ResumeLayout(false);
panelTotal.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();
panelB0.ResumeLayout(false);
panelB0.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackB0).EndInit();
panelC1.ResumeLayout(false);
panelC1.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackC1).EndInit();
panelA0.ResumeLayout(false);
panelA0.PerformLayout();
((System.ComponentModel.ISupportInitialize)trackA0).EndInit();
panelTitleCPU.ResumeLayout(false);
panelTitleCPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
@@ -857,14 +917,14 @@ namespace GHelper
private Label labelTip;
private Panel panelPower;
private Label labelInfo;
private Panel panelCPU;
private Label labelCPU;
private Label label2;
private TrackBar trackCPU;
private Panel panelTotal;
private Label labelTotal;
private Label labelPlatform;
private TrackBar trackTotal;
private Panel panelB0;
private Label labelB0;
private Label labelLeftB0;
private TrackBar trackB0;
private Panel panelA0;
private Label labelA0;
private Label labelLeftA0;
private TrackBar trackA0;
private Panel panelTitleCPU;
private PictureBox pictureBox1;
private Label labelPowerLimits;
@@ -899,5 +959,9 @@ namespace GHelper
private RComboBox comboBoost;
private PictureBox picturePerf;
private Label labelFans;
private Panel panelC1;
private Label labelC1;
private Label labelLeftC1;
private TrackBar trackC1;
}
}

View File

@@ -77,17 +77,22 @@ namespace GHelper
buttonReset.Click += ButtonReset_Click;
trackTotal.Maximum = AsusACPI.MaxTotal;
trackTotal.Minimum = AsusACPI.MinTotal;
trackA0.Maximum = AsusACPI.MaxTotal;
trackA0.Minimum = AsusACPI.MinTotal;
trackCPU.Maximum = AsusACPI.MaxCPU;
trackCPU.Minimum = AsusACPI.MinCPU;
trackB0.Maximum = AsusACPI.MaxCPU;
trackB0.Minimum = AsusACPI.MinCPU;
trackCPU.Scroll += TrackPower_Scroll;
trackTotal.Scroll += TrackPower_Scroll;
trackC1.Maximum = AsusACPI.MaxTotal;
trackC1.Minimum = AsusACPI.MinTotal;
trackCPU.MouseUp += TrackPower_MouseUp;
trackTotal.MouseUp += TrackPower_MouseUp;
trackC1.Scroll += TrackPower_Scroll;
trackB0.Scroll += TrackPower_Scroll;
trackA0.Scroll += TrackPower_Scroll;
trackC1.MouseUp += TrackPower_MouseUp;
trackB0.MouseUp += TrackPower_MouseUp;
trackA0.MouseUp += TrackPower_MouseUp;
checkApplyFans.Click += CheckApplyFans_Click;
checkApplyPower.Click += CheckApplyPower_Click;
@@ -140,6 +145,15 @@ namespace GHelper
public void InitGPU(bool readClocks = false)
{
if (Program.acpi.DeviceGet(AsusACPI.GPUEco) == 1)
{
gpuVisible = panelGPU.Visible = false;
return;
}
if (HardwareControl.GpuControl is null) HardwareControl.RecreateGpuControl();
if (HardwareControl.GpuControl is not null && HardwareControl.GpuControl.IsNvidia)
{
nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
@@ -303,7 +317,7 @@ namespace GHelper
}
else
{
MinimumSize = new Size(0, Program.settingsForm.Height);
Size = MinimumSize = new Size(0, Program.settingsForm.Height);
Height = Program.settingsForm.Height;
Top = Program.settingsForm.Top;
}
@@ -397,31 +411,45 @@ namespace GHelper
public void InitPower(bool changed = false)
{
bool cpuBmode = (Program.acpi.DeviceGet(AsusACPI.PPT_CPUB0) >= 0); // 2022 model +
bool cpuAmode = (Program.acpi.DeviceGet(AsusACPI.PPT_TotalA0) >= 0); // 2021 model +
bool modeA0 = Program.acpi.DeviceGet(AsusACPI.PPT_TotalA0) >= 0;
bool modeB0 = Program.acpi.IsAllAmdPPT();
bool modeC1 = Program.acpi.DeviceGet(AsusACPI.PPT_APUC1) >= 0;
powerVisible = panelPower.Visible = cpuAmode;
panelCPU.Visible = cpuBmode;
powerVisible = panelPower.Visible = modeA0;
panelB0.Visible = modeB0;
// Yes, that's stupid, but Total slider on 2021 model actually adjusts CPU PPT
if (!cpuBmode)
// All AMD version has B0 but doesn't have C0 (Nvidia GPU) settings
if (modeB0)
{
labelPlatform.Text = "CPU PPT";
labelLeftA0.Text = "Platform (CPU + GPU)";
labelLeftB0.Text = "CPU";
panelC1.Visible = false;
}
else
{
labelLeftA0.Text = "CPU Slow (SPL + sPPT)";
labelLeftC1.Text = "CPU Fast (fPPT)";
panelC1.Visible = modeC1;
}
int limit_total;
int limit_cpu;
int limit_fast;
bool apply = AppConfig.getConfigPerf("auto_apply_power") == 1;
if (changed)
{
limit_total = trackTotal.Value;
limit_cpu = trackCPU.Value;
limit_total = trackA0.Value;
limit_cpu = trackB0.Value;
limit_fast = trackC1.Value;
}
else
{
limit_total = AppConfig.getConfigPerf("limit_total");
limit_cpu = AppConfig.getConfigPerf("limit_cpu");
limit_fast = AppConfig.getConfigPerf("limit_fast");
}
if (limit_total < 0) limit_total = AsusACPI.DefaultTotal;
@@ -433,15 +461,23 @@ namespace GHelper
if (limit_cpu < AsusACPI.MinCPU) limit_cpu = AsusACPI.MinCPU;
if (limit_cpu > limit_total) limit_cpu = limit_total;
trackTotal.Value = limit_total;
trackCPU.Value = limit_cpu;
if (limit_fast < 0) limit_fast = AsusACPI.DefaultTotal;
if (limit_fast > AsusACPI.MaxTotal) limit_fast = AsusACPI.MaxTotal;
if (limit_fast < AsusACPI.MinTotal) limit_fast = AsusACPI.MinTotal;
trackA0.Value = limit_total;
trackB0.Value = limit_cpu;
trackC1.Value = limit_fast;
checkApplyPower.Checked = apply;
labelTotal.Text = trackTotal.Value.ToString() + "W";
labelCPU.Text = trackCPU.Value.ToString() + "W";
labelA0.Text = trackA0.Value.ToString() + "W";
labelB0.Text = trackB0.Value.ToString() + "W";
labelC1.Text = trackC1.Value.ToString() + "W";
AppConfig.setConfigPerf("limit_total", limit_total);
AppConfig.setConfigPerf("limit_cpu", limit_cpu);
AppConfig.setConfigPerf("limit_fast", limit_fast);
}
@@ -466,7 +502,6 @@ namespace GHelper
chartMid.Visible = true;
SetChart(chartMid, AsusFan.Mid);
LoadProfile(seriesMid, AsusFan.Mid);
MinimumSize = new Size(0, chartCount * 400 + 200);
}
else
{
@@ -481,13 +516,23 @@ namespace GHelper
chartXGM.Visible = true;
SetChart(chartXGM, AsusFan.XGM);
LoadProfile(seriesXGM, AsusFan.XGM);
MinimumSize = new Size(0, chartCount * 400 + 200);
}
else
{
AppConfig.setConfig("xgm_fan", 0);
}
try
{
if (chartCount > 2)
Size = MinimumSize = new Size(0, (int)(ControlHelper.GetDpiScale(this).Value * (chartCount * 200 + 100)));
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
SetChart(chartCPU, AsusFan.CPU);
SetChart(chartGPU, AsusFan.GPU);

View File

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

View File

@@ -1,12 +1,9 @@
using NvAPIWrapper.GPU;
using NvAPIWrapper.Native;
using NvAPIWrapper.Native.Delegates;
using NvAPIWrapper.Native.GPU;
using NvAPIWrapper.Native.GPU.Structures;
using NvAPIWrapper.Native.Interfaces.GPU;
using System;
using System.Diagnostics;
using System.Management;
using static NvAPIWrapper.Native.GPU.Structures.PerformanceStates20InfoV1;
namespace GHelper.Gpu;
@@ -35,8 +32,7 @@ public class NvidiaGpuControl : IGpuControl
public int? GetCurrentTemperature()
{
if (!IsValid)
return null;
if (!IsValid) return null;
PhysicalGPU internalGpu = _internalGpu!;
IThermalSensor? gpuSensor =
@@ -50,6 +46,38 @@ public class NvidiaGpuControl : IGpuControl
{
}
public void KillGPUApps()
{
if (!IsValid) return;
PhysicalGPU internalGpu = _internalGpu!;
try
{
Process[] processes = internalGpu.GetActiveApplications();
foreach (Process process in processes)
{
try
{
process?.Kill();
Logger.WriteLine("Stopped: " + process.ProcessName);
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
//NVIDIA.RestartDisplayDriver();
}
public int GetClocks(out int core, out int memory)
{
@@ -66,10 +94,11 @@ public class NvidiaGpuControl : IGpuControl
Logger.WriteLine($"GET GPU CLOCKS: {core}, {memory}");
return 0;
} catch (Exception ex)
}
catch (Exception ex)
{
Logger.WriteLine("GET GPU CLOCKS:" + ex.Message);
core = memory = 0;
core = memory = 0;
return -1;
}
@@ -123,7 +152,7 @@ public class NvidiaGpuControl : IGpuControl
//Thread.Sleep(2000);
return true;
}
catch (Exception ex )
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
return false;
@@ -163,7 +192,7 @@ public class NvidiaGpuControl : IGpuControl
}
catch (Exception ex)
{
Logger.WriteLine("SET GPU CLOCKS: "+ex.Message);
Logger.WriteLine("SET GPU CLOCKS: " + ex.Message);
return -1;
}

View File

@@ -19,9 +19,12 @@ public static class HardwareControl
public static int GetFanMax()
{
int max = 58;
int configMax = AppConfig.getConfig("fan_max");
if (configMax > 100) configMax = 0; // skipping inadvequate settings
if (AppConfig.ContainsModel("401")) max = 72;
else if (AppConfig.ContainsModel("503")) max = 68;
return Math.Max(max, AppConfig.getConfig("fan_max"));
return Math.Max(max, configMax);
}
public static void SetFanMax(int fan)
@@ -155,6 +158,7 @@ public static class HardwareControl
if (_gpuControl.IsValid)
{
GpuControl = _gpuControl;
Logger.WriteLine(GpuControl.FullName);
return;
}
@@ -164,15 +168,52 @@ public static class HardwareControl
if (_gpuControl.IsValid)
{
GpuControl = _gpuControl;
Logger.WriteLine(GpuControl.FullName);
return;
}
_gpuControl.Dispose();
GpuControl = null;
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
}
public static void KillGPUApps()
{
List<string> tokill = new() { "EADesktop", "RadeonSoftware", "epicgameslauncher" };
if (AppConfig.isConfig("kill_gpu_apps"))
{
tokill.Add("nvdisplay.container");
tokill.Add("nvcontainer");
tokill.Add("nvcplui");
}
foreach (string kill in tokill)
foreach (var process in Process.GetProcessesByName(kill))
{
try
{
process.Kill();
Logger.WriteLine($"Stopped: {process.ProcessName}");
}
catch (Exception ex)
{
Logger.WriteLine($"Failed to stop: {process.ProcessName} {ex.Message}");
}
}
if (AppConfig.isConfig("kill_gpu_apps") && GpuControl is not null && GpuControl.IsNvidia)
{
NvidiaGpuControl nvControl = (NvidiaGpuControl)GpuControl;
nvControl.KillGPUApps();
}
}
}

View File

@@ -1,10 +1,8 @@
using HidLibrary;
using Microsoft.Win32;
using NAudio.CoreAudioApi;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using Tools;
namespace GHelper
{
@@ -54,73 +52,102 @@ namespace GHelper
public class InputDispatcher
{
private static nint windowHandle;
System.Timers.Timer timer = new System.Timers.Timer(1000);
public bool backlight = true;
public static Keys keyProfile = Keys.F5;
public static Keys keyApp = Keys.F12;
KeyboardListener listener;
KeyboardHook hook = new KeyboardHook();
KeyHandler m1, m2, togggle;
public InputDispatcher(nint handle)
public InputDispatcher()
{
windowHandle = handle;
byte[] result = Program.acpi.DeviceInit();
Debug.WriteLine($"Init: {BitConverter.ToString(result)}");
Program.acpi.SubscribeToEvents(WatcherEventArrived);
//Task.Run(Program.acpi.RunListener);
// CTRL + SHIFT + F5 to cycle profiles
if (AppConfig.getConfig("keybind_profile") != -1) keyProfile = (Keys)AppConfig.getConfig("keybind_profile");
togggle = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, keyProfile, windowHandle);
m1 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeDown, windowHandle);
m2 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeUp, windowHandle);
hook.KeyPressed += new EventHandler<KeyPressedEventArgs>(KeyPressed);
RegisterKeys();
timer.Elapsed += Timer_Elapsed;
}
public void InitListener()
private void Timer_Elapsed(object? sender, System.Timers.ElapsedEventArgs e)
{
TimeSpan iddle = NativeMethods.GetIdleTime();
int kb_timeout;
if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)
kb_timeout = AppConfig.getConfig("keyboard_ac_timeout", 0);
else
kb_timeout = AppConfig.getConfig("keyboard_timeout", 60);
if (kb_timeout == 0) return;
if (backlight && iddle.TotalSeconds > kb_timeout)
{
backlight = false;
AsusUSB.ApplyBrightness(0);
}
if (!backlight && iddle.TotalSeconds < kb_timeout)
{
backlight = true;
AsusUSB.ApplyBrightness(AppConfig.getConfig("keyboard_brightness"));
}
//Debug.WriteLine(iddle.TotalSeconds);
}
public void Init()
{
if (listener is not null) listener.Dispose();
Program.acpi.DeviceInit();
if (!OptimizationService.IsRunning())
listener = new KeyboardListener(HandleEvent);
InitBacklightTimer();
}
public void InitBacklightTimer()
{
timer.Enabled = (AppConfig.getConfig("keyboard_timeout") > 0 && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online) ||
(AppConfig.getConfig("keyboard_ac_timeout") > 0 && SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online);
}
public void RegisterKeys()
{
hook.UnregisterAll();
// CTRL + SHIFT + F5 to cycle profiles
if (AppConfig.getConfig("keybind_profile") != -1) keyProfile = (Keys)AppConfig.getConfig("keybind_profile");
if (AppConfig.getConfig("keybind_app") != -1) keyApp = (Keys)AppConfig.getConfig("keybind_app");
string actionM1 = AppConfig.getConfigString("m1");
string actionM2 = AppConfig.getConfigString("m2");
togggle.Unregiser();
m1.Unregiser();
m2.Unregiser();
if (keyProfile != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyProfile);
if (keyApp != Keys.None) hook.RegisterHotKey(ModifierKeys.Shift | ModifierKeys.Control, keyApp);
if (keyProfile != Keys.None)
{
togggle.Register();
}
if (!AppConfig.ContainsModel("Z13"))
if (actionM1 is not null && actionM1.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeDown);
if (actionM2 is not null && actionM2.Length > 0) hook.RegisterHotKey(ModifierKeys.None, Keys.VolumeUp);
if (actionM1 is not null && actionM1.Length > 0)
{
m1.Register();
}
// FN-Lock group
if (actionM2 is not null && actionM2.Length > 0)
{
m2.Register();
}
if (AppConfig.isConfig("fn_lock") && !AppConfig.ContainsModel("VivoBook"))
for (Keys i = Keys.F1; i <= Keys.F11; i++) hook.RegisterHotKey(ModifierKeys.None, i);
}
@@ -140,12 +167,102 @@ namespace GHelper
if (intKey > 0)
NativeMethods.KeyPress(intKey);
KeyboardHook.KeyPress((Keys)intKey);
else
LaunchProcess(command);
}
public void KeyPressed(object sender, KeyPressedEventArgs e)
{
if (e.Modifier == ModifierKeys.None)
{
Logger.WriteLine(e.Key.ToString());
if (AppConfig.ContainsModel("Z13"))
{
switch (e.Key)
{
case Keys.F2:
KeyboardHook.KeyPress(Keys.VolumeDown);
return;
case Keys.F3:
KeyboardHook.KeyPress(Keys.VolumeUp);
return;
case Keys.F4:
KeyProcess("m3");
return;
case Keys.F11:
OptimizationEvent(199);
return;
}
}
switch (e.Key)
{
case Keys.F1:
KeyboardHook.KeyPress(Keys.VolumeMute);
break;
case Keys.F2:
OptimizationEvent(197);
break;
case Keys.F3:
OptimizationEvent(196);
break;
case Keys.F4:
KeyProcess("fnf4");
break;
case Keys.F5:
KeyProcess("fnf5");
break;
case Keys.F6:
KeyboardHook.KeyPress(Keys.Snapshot);
break;
case Keys.F7:
if (AppConfig.ContainsModel("TUF"))
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, ScreenBrightness.Adjust(-10) + "%", ToastIcon.BrightnessDown);
OptimizationEvent(16);
break;
case Keys.F8:
if (AppConfig.ContainsModel("TUF"))
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, ScreenBrightness.Adjust(+10) + "%", ToastIcon.BrightnessUp);
OptimizationEvent(32);
break;
case Keys.F9:
KeyboardHook.KeyWinPress(Keys.P);
break;
case Keys.F10:
OptimizationEvent(107);
break;
case Keys.F11:
OptimizationEvent(108);
break;
case Keys.F12:
KeyboardHook.KeyWinPress(Keys.A);
break;
case Keys.VolumeDown:
KeyProcess("m1");
break;
case Keys.VolumeUp:
KeyProcess("m2");
break;
default:
break;
}
}
if (e.Modifier == (ModifierKeys.Control | ModifierKeys.Shift))
{
if (e.Key == keyProfile) Program.settingsForm.CyclePerformanceMode();
if (e.Key == keyApp) Program.SettingsToggle();
}
}
public static void KeyProcess(string name = "m3")
{
string action = AppConfig.getConfigString(name);
@@ -165,13 +282,13 @@ namespace GHelper
switch (action)
{
case "mute":
NativeMethods.KeyPress(NativeMethods.VK_VOLUME_MUTE);
KeyboardHook.KeyPress(Keys.VolumeMute);
break;
case "play":
NativeMethods.KeyPress(NativeMethods.VK_MEDIA_PLAY_PAUSE);
KeyboardHook.KeyPress(Keys.MediaPlayPause);
break;
case "screenshot":
NativeMethods.KeyPress(NativeMethods.VK_SNAPSHOT);
KeyboardHook.KeyPress(Keys.Snapshot);
break;
case "screen":
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
@@ -217,6 +334,13 @@ namespace GHelper
}
}
static void ToggleFnLock()
{
int fnLock = AppConfig.isConfig("fn_lock") ? 0 : 1;
AppConfig.setConfig("fn_lock", fnLock);
Program.acpi.DeviceSet(AsusACPI.FnLock, (fnLock == 1) ? 0 : 1, "FnLock");
}
static void TabletMode()
{
bool touchpadState = GetTouchpadState();
@@ -242,14 +366,22 @@ namespace GHelper
Program.settingsForm.BeginInvoke(Program.settingsForm.CyclePerformanceMode);
return;
case 179: // FN+F4
case 178: // FN+F4
KeyProcess("fnf4");
return;
case 189: // Tablet mode
TabletMode();
return;
case 78: // Fn + ESC
ToggleFnLock();
return;
}
if (OptimizationService.IsRunning()) return;
if (!OptimizationService.IsRunning()) OptimizationEvent(EventID);
}
static void OptimizationEvent(int EventID)
{
// Asus Optimization service Events
@@ -297,11 +429,11 @@ namespace GHelper
static void LaunchProcess(string command = "")
{
string executable = command.Split(' ')[0];
string arguments = command.Substring(executable.Length).Trim();
try
{
string executable = command.Split(' ')[0];
string arguments = command.Substring(executable.Length).Trim();
Process proc = Process.Start(executable, arguments);
}
catch

173
app/KeyboardHook.cs Normal file
View File

@@ -0,0 +1,173 @@
using System.Runtime.InteropServices;
public sealed class KeyboardHook : IDisposable
{
// Registers a hot key with Windows.
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
// Unregisters the hot key with Windows.
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2;
private const byte VK_LWIN = 0x5B;
public static void KeyPress(Keys key)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
}
public static void KeyWinPress(Keys key)
{
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
/// <summary>
/// Represents the window that is used internally to get the messages.
/// </summary>
private class Window : NativeWindow, IDisposable
{
private static int WM_HOTKEY = 0x0312;
public static Keys? fakeKey;
public Window()
{
// create the handle for the window.
this.CreateHandle(new CreateParams());
}
/// <summary>
/// Overridden to get the notifications.
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
// check if we got a hot key pressed.
if (m.Msg == WM_HOTKEY)
{
// get the keys.
Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
ModifierKeys modifier = (ModifierKeys)((int)m.LParam & 0xFFFF);
// invoke the event to notify the parent.
if (KeyPressed != null)
KeyPressed(this, new KeyPressedEventArgs(modifier, key));
}
}
public event EventHandler<KeyPressedEventArgs> KeyPressed;
#region IDisposable Members
public void Dispose()
{
this.DestroyHandle();
}
#endregion
}
private Window _window = new Window();
private int _currentId;
public KeyboardHook()
{
// register the event of the inner native window.
_window.KeyPressed += delegate (object sender, KeyPressedEventArgs args)
{
if (KeyPressed != null)
KeyPressed(this, args);
};
}
/// <summary>
/// Registers a hot key in the system.
/// </summary>
/// <param name="modifier">The modifiers that are associated with the hot key.</param>
/// <param name="key">The key itself that is associated with the hot key.</param>
public void RegisterHotKey(ModifierKeys modifier, Keys key)
{
// increment the counter.
_currentId = _currentId + 1;
// register the hot key.
if (!RegisterHotKey(_window.Handle, _currentId, (uint)modifier, (uint)key))
Logger.WriteLine("Couldnt register " + key);
}
/// <summary>
/// A hot key has been pressed.
/// </summary>
public event EventHandler<KeyPressedEventArgs> KeyPressed;
#region IDisposable Members
public void UnregisterAll()
{
// unregister all the registered hot keys.
for (int i = _currentId; i > 0; i--)
{
UnregisterHotKey(_window.Handle, i);
}
}
public void Dispose()
{
UnregisterAll();
// dispose the inner native window.
_window.Dispose();
}
#endregion
}
/// <summary>
/// Event Args for the event that is fired after the hot key has been pressed.
/// </summary>
public class KeyPressedEventArgs : EventArgs
{
private ModifierKeys _modifier;
private Keys _key;
internal KeyPressedEventArgs(ModifierKeys modifier, Keys key)
{
_modifier = modifier;
_key = key;
}
public ModifierKeys Modifier
{
get { return _modifier; }
}
public Keys Key
{
get { return _key; }
}
}
/// <summary>
/// The enumeration of possible modifiers.
/// </summary>
[Flags]
public enum ModifierKeys : uint
{
None = 0,
Alt = 1,
Control = 2,
Shift = 4,
Win = 8
}

View File

@@ -1,5 +1,4 @@
using GHelper;
using System.ComponentModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using static Tools.ScreenInterrogatory;
@@ -7,47 +6,6 @@ using static Tools.ScreenInterrogatory;
namespace Tools
{
public class KeyHandler
{
public const int NOMOD = 0x0000;
public const int ALT = 0x0001;
public const int CTRL = 0x0002;
public const int SHIFT = 0x0004;
public const int WIN = 0x0008;
public const int WM_HOTKEY_MSG_ID = 0x0312;
[DllImport("user32.dll")]
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
[DllImport("user32.dll")]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
private int modifier;
private int key;
private IntPtr hWnd;
private int id;
public KeyHandler(int modifier, Keys key, nint handle)
{
this.modifier = modifier;
this.key = (int)key;
this.hWnd = handle;
id = this.GetHashCode();
}
public override int GetHashCode()
{
return modifier ^ key ^ hWnd.ToInt32();
}
public bool Register()
{
return RegisterHotKey(hWnd, id, modifier, key);
}
public bool Unregiser()
{
return UnregisterHotKey(hWnd, id);
}
}
public static class ScreenInterrogatory
{
@@ -351,6 +309,25 @@ namespace Tools
public class NativeMethods
{
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
[DllImport("User32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static TimeSpan GetIdleTime()
{
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut);
GetLastInputInfo(ref lastInPut);
return TimeSpan.FromMilliseconds((uint)Environment.TickCount - lastInPut.dwTime);
}
private const int WM_SYSCOMMAND = 0x0112;
private const int SC_MONITORPOWER = 0xF170;
private const int MONITOR_OFF = 2;
@@ -439,24 +416,6 @@ public class NativeMethods
public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2;
public const int VK_MEDIA_NEXT_TRACK = 0xB0;
public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
public const int VK_MEDIA_PREV_TRACK = 0xB1;
public const int VK_VOLUME_MUTE = 0xAD;
public const int VK_SNAPSHOT = 0x2C;
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
public static void KeyPress(int key = VK_MEDIA_PLAY_PAUSE)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
}
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
public const int SW_RESTORE = 9;
@@ -743,6 +702,8 @@ public class NativeMethods
{
Guid activeSchemeGuid = GetActiveScheme();
if (boost == GetCPUBoost()) return;
var hrAC = PowerWriteACValueIndex(
IntPtr.Zero,
activeSchemeGuid,

View File

@@ -1,6 +1,7 @@
using System.Text.RegularExpressions;
using System.Text;
using System.Diagnostics;
using Microsoft.Win32;
namespace GHelper
{
@@ -40,6 +41,25 @@ namespace GHelper
return (Process.GetProcessesByName("AsusOptimization").Count() > 0);
}
public static void SetBacklightOffDelay(int value = 60)
{
try
{
RegistryKey myKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\ASUS\ASUS System Control Interface\AsusOptimization\ASUS Keyboard Hotkeys", true);
if (myKey != null)
{
myKey.SetValue("TurnOffKeybdLight", value, RegistryValueKind.DWord);
myKey.Close();
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
}
}
}
}

View File

@@ -29,7 +29,7 @@ namespace GHelper
public static InputDispatcher inputDispatcher;
private static PowerLineStatus isPlugged = PowerLineStatus.Unknown;
private static PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
// The main entry point for the application
public static void Main(string[] args)
@@ -77,7 +77,7 @@ namespace GHelper
trayIcon.MouseClick += TrayIcon_MouseClick;
inputDispatcher = new InputDispatcher(ds);
inputDispatcher = new InputDispatcher();
settingsForm.InitAura();
settingsForm.InitMatrix();
@@ -144,7 +144,7 @@ namespace GHelper
isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
Logger.WriteLine("AutoSetting for " + isPlugged.ToString());
inputDispatcher.InitListener();
inputDispatcher.Init();
settingsForm.SetBatteryChargeLimit(AppConfig.getConfig("charge_limit"));
settingsForm.AutoPerformance();
@@ -163,9 +163,10 @@ namespace GHelper
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;
Logger.WriteLine("Windows - Power Mode Changed");
Logger.WriteLine("Power Mode Changed");
SetAutoModes();
}

View File

@@ -277,7 +277,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to Seconds to turn off backlight on battery.
/// Looks up a localized string similar to Backlight timeout on battery.
/// </summary>
internal static string BacklightTimeout {
get {
@@ -285,6 +285,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Backlight timeout when plugged (0 - always on).
/// </summary>
internal static string BacklightTimeoutPlugged {
get {
return ResourceManager.GetString("BacklightTimeoutPlugged", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Balanced.
/// </summary>
@@ -484,7 +493,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to Fan: .
/// Looks up a localized string similar to Fan: .
/// </summary>
internal static string FanSpeed {
get {
@@ -501,6 +510,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Process Fn+F hotkeys without Fn.
/// </summary>
internal static string FnLock {
get {
return ResourceManager.GetString("FnLock", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Dynamic Boost.
/// </summary>
@@ -618,6 +636,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Stop all apps using GPU when switching to Eco.
/// </summary>
internal static string KillGpuApps {
get {
return ResourceManager.GetString("KillGpuApps", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Laptop Backlight.
/// </summary>

View File

@@ -190,7 +190,10 @@
<value>Encendida</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Apagar retroiluminación con batería (segundos)</value>
<value>Apagar con batería tras (segundos)</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>Apagar cuando está enchufado tras (0 - nunca)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
@@ -303,6 +306,9 @@
<data name="KeyboardAuto" xml:space="preserve">
<value>Bajar retroiluminación con batería</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Detener todas las aplicaciones que usan la dGPU cuando se cambia a Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Retroiluminación</value>
</data>

View File

@@ -0,0 +1,471 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
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
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ACPIError" xml:space="preserve">
<value>Nie można odnaleźć sterownika ASUS ACPI. Aplikacja nie może bez niego funkcjonować. Spróbuj zainstalować Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Wygląda na to, że GPU jest mocno obciążone. Wyłączyć?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Tryb Eco</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Wyłączenie trybu Ultimate wymaga ponownego uruchomienia</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Tryb Ultimate wymaga ponownego uruchomienia</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Uruchomić ponownie teraz?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Prędkość animacji</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>Anime Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>Aplikacja jest już uruchomiona</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper jest już uruchomiony. Sprawdź obszar powiadomień na pasku zadań.</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Zastosuj krzywe</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Zastosuj limity</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Automatycznie dostosuj Plan Zasilania Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Oddychanie</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Pętla kolorów</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Szybka</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normalna</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Tęcza</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Powolna</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Statyczny</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Stroboskop</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Auto</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Automatycznie ustaw odświeżanie 60 Hz w czasie pracy na baterii</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Aktywność</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Wyłączenie podświetlenia na baterii</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>Wyłączenie podświetlenia po podłączeniu (0 - nigdy)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balans</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limit ładowania baterii</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Podczas uruchamiania</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Jasność</value>
</data>
<data name="Color" xml:space="preserve">
<value>Kolor</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Niestandardowy</value>
</data>
<data name="Default" xml:space="preserve">
<value>Domyślny</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Wyłącz funkcję Overdrive monitora</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Zużycie mocy</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Pobierz aktualizację</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Wyłącza dedykowane GPU aby oszczędzić baterię</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Eco</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Ustawienia</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Dodatkowe ustawienia</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Ustawienia fabryczne</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Krzywe wentylatorów</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Krzywa wentylatora CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Krzywa wentylatora GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Krzywa wentylatora centralnego</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Tryb krzywych</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Wentylatory i moc</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Obroty: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Dostosuj</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Przełączanie</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Przesunięcie zegara rdzenia</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Przesunięcie zegara pamięci</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Tryb GPU</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>tylko iGPU</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>tylko dGPU</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Ustawienia GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Temperatura docelowa</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Ustawienia klawiszy skrótów</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Klawiatura</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Automatycznie zmniejsz jasność w czasie pracy na baterii</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Podświetlenie</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Klawiatura laptopa</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Ekran laptopa</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Pokrywa</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Lightbar</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Wizualizer muzyki</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Binarny</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Jasny</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Clock</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Ciemny</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Logo ROG</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Średni</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Wyłączony</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Obraz</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Maksymalna częstotliwość odświeżania dla mniejszych opóźnień</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>Częstotliwość odświeżania 60 Hz dla oszczędzania baterii</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizone</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Wyciszenie mikrofonu</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Otwórz okno G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Optymalny</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Przełącza na Eco w czasie pracy na baterii i na Standard po podłączeniu</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>W trybie Optymalnym wyłącz GPU podczas ładowania przez USB-C</value>
</data>
<data name="Other" xml:space="preserve">
<value>Inne</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Tryb zasilania</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Obraz / GIF</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Odtwórz / Pauza</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Limit mocy (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Ustawienie limitu mocy (PPT) jest funkcją eksperymentalną. Używaj ostrożnie, na własną odpowiedzialność!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>Zrzut ekranu</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Zamknij</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Coś korzysta z dedykowanego GPU i uniemożliwia włączenie trybu Eco. Zresetować dedykowany GPU w Menadżerze Urządzeń? * Używaj na własną odpowiedzialność</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Uruchom przy starcie systemu</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Zamknij</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Cichy</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Uśpij</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Enables dGPU for standard use</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Standard</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Błąd uruchamiania</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Przełącz Aura</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Przełącz MiniLED</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Przełącz ekran</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Wyłączony</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Wyłączony na baterii</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Podłącza ekran laptopa bezpośrednio do dedykowanego GPU</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Wersja</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Zmniejsz głośność</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Wyciszenie</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Zwiększ głośność</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Zachowaj okno aplikacji zawsze na wierzchu</value>
</data>
</root>

View File

@@ -190,7 +190,10 @@
<value>Awake</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Seconds to turn off backlight on battery</value>
<value>Backlight timeout on battery</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>Backlight timeout when plugged (0 - always on)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balanced</value>
@@ -259,11 +262,14 @@
<value>Fans and Power</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value> Fan: </value>
<value>Fan: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Fans + Power</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>Process Fn+F hotkeys without Fn</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
@@ -303,6 +309,9 @@
<data name="KeyboardAuto" xml:space="preserve">
<value>Lower backlight brightness on battery and back when plugged</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Stop all apps using GPU when switching to Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Laptop Backlight</value>
</data>

View File

@@ -189,6 +189,12 @@
<data name="Awake" xml:space="preserve">
<value>Робота</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Тайм-аут підсвітки на батареї</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>Тайм-аут підсвітки на зарядці (0 - завжди ввімкнено)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Баланс</value>
</data>
@@ -282,6 +288,9 @@
<data name="KeyboardAuto" xml:space="preserve">
<value>Вимкнути підсвітку на батареї та увімкнути на зарядці</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Закривати додатки, що використовують GPU, під час переходу в режим Eco</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Підсвітка</value>
</data>
@@ -291,6 +300,9 @@
<data name="LaptopScreen" xml:space="preserve">
<value>Дисплей</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Аудіо візуалізатор</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Бінарний банер</value>
</data>
@@ -324,6 +336,9 @@
<data name="Multizone" xml:space="preserve">
<value>Мультизони</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Вимкнути мікрофон</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Відкрити вікно G-Helper</value>
</data>
@@ -333,6 +348,9 @@
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Вмикає Еко на батареї та Стандартний на зарядці</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Вимикати GPU на зарядці від USB-C в режимі Авто</value>
</data>
<data name="Other" xml:space="preserve">
<value>Інше</value>
</data>
@@ -387,6 +405,12 @@
<data name="ToggleAura" xml:space="preserve">
<value>Аура</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Міні-лед (якщо є)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Вимкнути екран</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Турбо</value>
</data>
@@ -405,9 +429,15 @@
<data name="VersionLabel" xml:space="preserve">
<value>Версія</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Зменшення гучності</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Вимкнення звуку</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Збільшення гучності</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Тримати вікно завжди зверху</value>
</data>

View File

@@ -0,0 +1,468 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
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
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ACPIError" xml:space="preserve">
<value>Không thể kết nối đến ASUS ACPI. Chương trình cần nó để có thể hoạt động. Hãy thử cài lại Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Có vẻ như GPU rời đang được sử dụng nhiều, tắt nó?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Chế độ Tiết kiệm</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Chuyển sang Chế độ Ultimate cần phải khởi động lại</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Chế độ Ultimate yêu cầu phải khởi động lại</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Khởi động lại ngay?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Tốc độ</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>AniMe Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>Chương trình đã chạy</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper đã chạy. Hãy kiểm tra khay hệ thống</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Áp dụng Chế độ quạt tuỳ chỉnh</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Áp dụng Giới hạn nguồn</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Tự động điều chỉnh Chế độ nguồn của Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Hơi thở</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Chuyển màu</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Nhanh</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Bình thường</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Cầu vồng</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Chậm</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Tĩnh</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Nhấp nháy</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Tự động</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Chuyển về 60Hz để tiết kiệm pin, và chuyển lại tần số quét cao khi cắm sạc</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Đang bật</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Số giây để tắt đèn nền bàn phím(khi dùng pin)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Cân bằng</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Giới hạn sạc</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Khởi động</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Độ sáng</value>
</data>
<data name="Color" xml:space="preserve">
<value>Màu</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>Tăng tốc CPU</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Tuỳ chỉnh</value>
</data>
<data name="Default" xml:space="preserve">
<value>Mặc định</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Tắt Overdrive</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Đang không sạc</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Tải xuống Bản cập nhật</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Tắt GPU rời để tiết kiệm pin</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Tiết kiệm</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Thêm</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Cài đặt bổ sung</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Đặt về Mặc định</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Chế độ Quạt</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Cấu hình Quạt CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Cấu hình Quạt GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Cấu hình Quạt giữa</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Cấu hình Quạt</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Quạt và Nguồn điện</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value> Quạt: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Quạt + Nguồn</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Đang đổi GPU</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Bù trừ Tốc độ Nhân GPU</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Bù trừ Tốc độ RAM GPU</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Chế độ GPU</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>Chỉ GPU tích hợp</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>GPU tích hợp + GPU rời</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>Độc quyền của GPU rời</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Cài đặt GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Nhiệt độ đích</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Tổ hợp phím</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Bàn phím</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Giảm độ sáng bàn phím khi không cắm sạc</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Độ sáng đèn nền</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Bàn phím Laptop</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Màn hình Laptop</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Màn gập</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Thanh sáng</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Sóng nhạc</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Nhị phân</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Sáng</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Đồng hồ</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Sáng mờ</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Logo ROG</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Vừa phải</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Tắt</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Hình ảnh</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Tốc độ làm mới tối đa để có độ trễ thấp</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>Tốc độ làm mới 60Hz để tiết kiệm pin</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Đèn nền Đa vùng(Multi-Zone)</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Tắt Mic</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Mở cửa sổ G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Tối ưu</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Chuyển về Chế độ Tiết kiệm khi dùng pin và Chế độ Tiêu chuẩn khi cắm sạc</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Tắt GPU khi dùng sạc Type-C ở Chế độ Tối ưu</value>
</data>
<data name="Other" xml:space="preserve">
<value>Khác</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Chế độ Hiệu suất</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Ảnh tĩnh / Ảnh Động</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Phát / Dừng</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Giới hạn Nguồn (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Giới hạn Nguồn (PPT) là tính năng thử nghiệm. Sử dụng nó cẩn thận và tự chịu mọi rủi ro!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>Chụp màn hình</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Thoát</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Không thể chuyển về Chế độ Tiết kiệm do có gì đó đang dùng GPU. Khởi động lại GPU rời trong Quản lý Thiết bị? * Bạn sẽ chịu mọi rủi ro.</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Chạy khi khởi động</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Tắt nguồn</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Im lặng</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Ngủ</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Bật GPU rời cho khi cho mức độ dùng tiêu chuẩn</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Tiêu chuẩn</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Khởi động lỗi</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Bật tắt Aura</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Bật tắt Miniled(Nếu có hỗ trợ)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Bật tắt màn hình</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Đã tắt</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Tắt khi không cắm sạc</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Định tuyến màn hình laptop đến Card rời, tối đa hóa FPS</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Phiên bản</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Giảm âm lượng</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Tắt âm lượng</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Tăng âm lượng</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Giữ cửa sổ ở trên cùng</value>
</data>
</root>

View File

@@ -189,6 +189,12 @@
<data name="Awake" xml:space="preserve">
<value>唤醒时</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>使用电池时的背光超时时间</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>插入电源时的背光超时时间 (0 - 始终开启)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
</data>
@@ -258,6 +264,9 @@
<data name="FansPower" xml:space="preserve">
<value>风扇与电源设置</value>
</data>
<data name="FnLock" xml:space="preserve">
<value>无需FN处理 Fn+F 热键</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>切换中...</value>
</data>
@@ -282,6 +291,9 @@
<data name="KeyboardAuto" xml:space="preserve">
<value>电池模式下降低键盘亮度以省电,并在插上电源时恢复</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>当切换到集显模式时停止所有正在使用dGPU的应用</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>背光</value>
</data>
@@ -324,6 +336,9 @@
<data name="Multizone" xml:space="preserve">
<value>多区域设置</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>静音麦克风</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>打开G-Helper窗口</value>
</data>
@@ -333,6 +348,9 @@
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>使用电池时切换到集显模式,并在插上电源后重新启用标准模式</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>在自动切换模式下使用USB-C充电器时禁用GPU</value>
</data>
<data name="Other" xml:space="preserve">
<value>其他</value>
</data>
@@ -405,10 +423,16 @@
<data name="VersionLabel" xml:space="preserve">
<value>版本</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>音量降低</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>静音</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>音量增加</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>窗口置顶</value>
</data>
</root>
</root>

View File

@@ -190,7 +190,10 @@
<value>喚醒時</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>電池模式下自動關閉背光的秒數</value>
<value>電池模式下自動關閉鍵盤背光的秒數(0 = 不關閉)</value>
</data>
<data name="BacklightTimeoutPlugged" xml:space="preserve">
<value>插電模式下自動關閉鍵盤背光的秒數(0 = 不關閉)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
@@ -301,7 +304,7 @@
<value>鍵盤</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>電池模式時自動降低鍵盤背光亮度以省電</value>
<value>電池模式時自動降低鍵盤背光亮度以省電</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>背光</value>
@@ -452,9 +455,15 @@
</data>
<data name="VersionLabel" xml:space="preserve">
<value>版本</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>音量降低</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>靜音</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>音量增加</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>視窗置頂</value>

164
app/Settings.Designer.cs generated
View File

@@ -66,9 +66,9 @@ namespace GHelper
tableGPU = new TableLayoutPanel();
buttonEco = new RButton();
buttonStandard = new RButton();
buttonXGM = new RButton();
buttonOptimized = new RButton();
buttonUltimate = new RButton();
buttonXGM = new RButton();
panelScreen = new Panel();
labelMidFan = new Label();
labelTipScreen = new Label();
@@ -81,12 +81,12 @@ namespace GHelper
labelSreen = new Label();
panelKeyboard = new Panel();
tableLayoutKeyboard = new TableLayoutPanel();
comboKeyboard = new RComboBox();
buttonKeyboard = new RButton();
panelColor = new Panel();
pictureColor2 = new PictureBox();
pictureColor = new PictureBox();
buttonKeyboardColor = new RButton();
buttonKeyboard = new RButton();
comboKeyboard = new RComboBox();
pictureKeyboard = new PictureBox();
labelKeyboard = new Label();
panelMatrix.SuspendLayout();
@@ -121,7 +121,7 @@ namespace GHelper
panelMatrix.Controls.Add(pictureMatrix);
panelMatrix.Controls.Add(labelMatrix);
panelMatrix.Dock = DockStyle.Top;
panelMatrix.Location = new Point(10, 758);
panelMatrix.Location = new Point(10, 795);
panelMatrix.Margin = new Padding(8);
panelMatrix.Name = "panelMatrix";
panelMatrix.Padding = new Padding(0, 0, 0, 12);
@@ -158,7 +158,7 @@ namespace GHelper
tableLayoutMatrix.Name = "tableLayoutMatrix";
tableLayoutMatrix.RowCount = 1;
tableLayoutMatrix.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutMatrix.Size = new Size(771, 60);
tableLayoutMatrix.Size = new Size(771, 59);
tableLayoutMatrix.TabIndex = 43;
//
// comboMatrix
@@ -202,7 +202,7 @@ namespace GHelper
buttonMatrix.Dock = DockStyle.Top;
buttonMatrix.FlatAppearance.BorderSize = 0;
buttonMatrix.FlatStyle = FlatStyle.Flat;
buttonMatrix.Location = new Point(518, 8);
buttonMatrix.Location = new Point(518, 7);
buttonMatrix.Margin = new Padding(4, 7, 4, 7);
buttonMatrix.Name = "buttonMatrix";
buttonMatrix.Secondary = true;
@@ -231,7 +231,7 @@ namespace GHelper
labelMatrix.Name = "labelMatrix";
labelMatrix.Size = new Size(170, 32);
labelMatrix.TabIndex = 38;
labelMatrix.Text = Properties.Strings.AnimeMatrix;
labelMatrix.Text = "Anime Matrix";
//
// panelBattery
//
@@ -244,7 +244,7 @@ namespace GHelper
panelBattery.Controls.Add(pictureBattery);
panelBattery.Controls.Add(labelBatteryTitle);
panelBattery.Dock = DockStyle.Top;
panelBattery.Location = new Point(10, 926);
panelBattery.Location = new Point(10, 963);
panelBattery.Margin = new Padding(8);
panelBattery.Name = "panelBattery";
panelBattery.Padding = new Padding(0, 0, 0, 12);
@@ -255,7 +255,7 @@ namespace GHelper
//
sliderBattery.Location = new Point(16, 70);
sliderBattery.Max = 100;
sliderBattery.Min = 50;
sliderBattery.Min = 40;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(772, 40);
sliderBattery.TabIndex = 39;
@@ -276,7 +276,7 @@ namespace GHelper
//
// labelVersion
//
labelVersion.AutoSize = false;
labelVersion.Cursor = Cursors.Hand;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(25, 119);
@@ -285,7 +285,6 @@ namespace GHelper
labelVersion.Size = new Size(300, 32);
labelVersion.TabIndex = 37;
labelVersion.Text = "v.0";
labelVersion.Cursor = Cursors.Hand;
//
// labelBattery
//
@@ -317,7 +316,7 @@ namespace GHelper
labelBatteryTitle.Name = "labelBatteryTitle";
labelBatteryTitle.Size = new Size(393, 36);
labelBatteryTitle.TabIndex = 34;
labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit;
labelBatteryTitle.Text = "Battery Charge Limit";
//
// panelFooter
//
@@ -326,7 +325,7 @@ namespace GHelper
panelFooter.Controls.Add(buttonQuit);
panelFooter.Controls.Add(checkStartup);
panelFooter.Dock = DockStyle.Top;
panelFooter.Location = new Point(10, 1089);
panelFooter.Location = new Point(10, 1126);
panelFooter.Margin = new Padding(8);
panelFooter.Name = "panelFooter";
panelFooter.Padding = new Padding(0, 0, 0, 10);
@@ -398,7 +397,7 @@ namespace GHelper
labelPerf.Name = "labelPerf";
labelPerf.Size = new Size(234, 32);
labelPerf.TabIndex = 31;
labelPerf.Text = Properties.Strings.PerformanceMode;
labelPerf.Text = "Performance Mode";
//
// labelCPUFan
//
@@ -572,7 +571,7 @@ namespace GHelper
labelGPU.Name = "labelGPU";
labelGPU.Size = new Size(136, 32);
labelGPU.TabIndex = 18;
labelGPU.Text = Properties.Strings.GPUMode;
labelGPU.Text = "GPU Mode";
//
// labelGPUFan
//
@@ -653,6 +652,29 @@ namespace GHelper
buttonStandard.TextImageRelation = TextImageRelation.ImageAboveText;
buttonStandard.UseVisualStyleBackColor = false;
//
// buttonXGM
//
buttonXGM.Activated = false;
buttonXGM.BackColor = SystemColors.ControlLightLight;
buttonXGM.BorderColor = Color.Transparent;
buttonXGM.BorderRadius = 5;
buttonXGM.Dock = DockStyle.Top;
buttonXGM.FlatAppearance.BorderSize = 0;
buttonXGM.FlatStyle = FlatStyle.Flat;
buttonXGM.ForeColor = SystemColors.ControlText;
buttonXGM.Image = Properties.Resources.icons8_video_48;
buttonXGM.ImageAlign = ContentAlignment.BottomCenter;
buttonXGM.Location = new Point(4, 132);
buttonXGM.Margin = new Padding(4);
buttonXGM.Name = "buttonXGM";
buttonXGM.Secondary = false;
buttonXGM.Size = new Size(185, 120);
buttonXGM.TabIndex = 2;
buttonXGM.Text = "XG Mobile";
buttonXGM.TextImageRelation = TextImageRelation.ImageAboveText;
buttonXGM.UseVisualStyleBackColor = false;
buttonXGM.Visible = false;
//
// buttonOptimized
//
buttonOptimized.Activated = false;
@@ -696,30 +718,6 @@ namespace GHelper
buttonUltimate.Text = Properties.Strings.UltimateMode;
buttonUltimate.TextImageRelation = TextImageRelation.ImageAboveText;
buttonUltimate.UseVisualStyleBackColor = false;
//
// buttonXGM
//
buttonXGM.Activated = false;
buttonXGM.BackColor = SystemColors.ControlLightLight;
buttonXGM.BorderColor = Color.Transparent;
buttonXGM.BorderRadius = 5;
buttonXGM.Dock = DockStyle.Top;
buttonXGM.FlatAppearance.BorderSize = 0;
buttonXGM.FlatStyle = FlatStyle.Flat;
buttonXGM.ForeColor = SystemColors.ControlText;
buttonXGM.Image = Properties.Resources.icons8_video_48;
buttonXGM.ImageAlign = ContentAlignment.BottomCenter;
buttonXGM.Location = new Point(390, 4);
buttonXGM.Margin = new Padding(4);
buttonXGM.Name = "buttonXGM";
buttonXGM.Secondary = false;
buttonXGM.Size = new Size(185, 120);
buttonXGM.TabIndex = 2;
buttonXGM.Text = "XG Mobile";
buttonXGM.TextImageRelation = TextImageRelation.ImageAboveText;
buttonXGM.UseVisualStyleBackColor = false;
buttonXGM.Visible = false;
//
// panelScreen
//
@@ -731,7 +729,7 @@ namespace GHelper
panelScreen.Controls.Add(pictureScreen);
panelScreen.Controls.Add(labelSreen);
panelScreen.Dock = DockStyle.Top;
panelScreen.Location = new Point(10, 447);
panelScreen.Location = new Point(10, 485);
panelScreen.Margin = new Padding(8);
panelScreen.Name = "panelScreen";
panelScreen.Padding = new Padding(0, 0, 0, 10);
@@ -878,7 +876,7 @@ namespace GHelper
labelSreen.Name = "labelSreen";
labelSreen.Size = new Size(176, 32);
labelSreen.TabIndex = 21;
labelSreen.Text = Properties.Strings.LaptopScreen;
labelSreen.Text = "Laptop Screen";
//
// panelKeyboard
//
@@ -888,11 +886,11 @@ namespace GHelper
panelKeyboard.Controls.Add(pictureKeyboard);
panelKeyboard.Controls.Add(labelKeyboard);
panelKeyboard.Dock = DockStyle.Top;
panelKeyboard.Location = new Point(10, 628);
panelKeyboard.Location = new Point(10, 666);
panelKeyboard.Margin = new Padding(8);
panelKeyboard.Name = "panelKeyboard";
panelKeyboard.Padding = new Padding(0, 0, 0, 12);
panelKeyboard.Size = new Size(810, 130);
panelKeyboard.Size = new Size(810, 129);
panelKeyboard.TabIndex = 39;
//
// tableLayoutKeyboard
@@ -901,37 +899,37 @@ namespace GHelper
tableLayoutKeyboard.AutoSize = true;
tableLayoutKeyboard.AutoSizeMode = AutoSizeMode.GrowAndShrink;
tableLayoutKeyboard.ColumnCount = 3;
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
tableLayoutKeyboard.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33F));
tableLayoutKeyboard.Controls.Add(buttonKeyboard, 0, 0);
tableLayoutKeyboard.Controls.Add(panelColor, 0, 0);
tableLayoutKeyboard.Controls.Add(comboKeyboard, 0, 0);
tableLayoutKeyboard.Controls.Add(panelColor, 1, 0);
tableLayoutKeyboard.Controls.Add(buttonKeyboard, 2, 0);
tableLayoutKeyboard.Location = new Point(16, 50);
tableLayoutKeyboard.Margin = new Padding(8);
tableLayoutKeyboard.Name = "tableLayoutKeyboard";
tableLayoutKeyboard.RowCount = 1;
tableLayoutKeyboard.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
tableLayoutKeyboard.Size = new Size(771, 60);
tableLayoutKeyboard.Size = new Size(771, 59);
tableLayoutKeyboard.TabIndex = 39;
//
// comboKeyboard
// buttonKeyboard
//
comboKeyboard.BorderColor = Color.White;
comboKeyboard.ButtonColor = Color.FromArgb(255, 255, 255);
comboKeyboard.Dock = DockStyle.Top;
comboKeyboard.FlatStyle = FlatStyle.Flat;
comboKeyboard.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboKeyboard.FormattingEnabled = true;
comboKeyboard.ItemHeight = 32;
comboKeyboard.Items.AddRange(new object[] { "Static", "Breathe", "Rainbow", "Strobe" });
comboKeyboard.Location = new Point(4, 10);
comboKeyboard.Margin = new Padding(4, 10, 4, 8);
comboKeyboard.Name = "comboKeyboard";
comboKeyboard.Size = new Size(249, 44);
comboKeyboard.TabIndex = 35;
comboKeyboard.TabStop = false;
buttonKeyboard.Activated = false;
buttonKeyboard.BackColor = SystemColors.ControlLight;
buttonKeyboard.BorderColor = Color.Transparent;
buttonKeyboard.BorderRadius = 2;
buttonKeyboard.Dock = DockStyle.Top;
buttonKeyboard.FlatAppearance.BorderSize = 0;
buttonKeyboard.FlatStyle = FlatStyle.Flat;
buttonKeyboard.Location = new Point(518, 7);
buttonKeyboard.Margin = new Padding(4, 7, 4, 7);
buttonKeyboard.Name = "buttonKeyboard";
buttonKeyboard.Secondary = true;
buttonKeyboard.Size = new Size(249, 45);
buttonKeyboard.TabIndex = 37;
buttonKeyboard.Text = Properties.Strings.Extra;
buttonKeyboard.UseVisualStyleBackColor = false;
//
// panelColor
//
@@ -940,7 +938,7 @@ namespace GHelper
panelColor.Controls.Add(pictureColor);
panelColor.Controls.Add(buttonKeyboardColor);
panelColor.Dock = DockStyle.Fill;
panelColor.Location = new Point(261, 8);
panelColor.Location = new Point(261, 7);
panelColor.Margin = new Padding(4, 7, 4, 7);
panelColor.Name = "panelColor";
panelColor.Size = new Size(249, 45);
@@ -984,23 +982,22 @@ namespace GHelper
buttonKeyboardColor.Text = Properties.Strings.Color;
buttonKeyboardColor.UseVisualStyleBackColor = false;
//
// buttonKeyboard
// comboKeyboard
//
buttonKeyboard.Activated = false;
buttonKeyboard.BackColor = SystemColors.ControlLight;
buttonKeyboard.BorderColor = Color.Transparent;
buttonKeyboard.BorderRadius = 2;
buttonKeyboard.Dock = DockStyle.Top;
buttonKeyboard.FlatAppearance.BorderSize = 0;
buttonKeyboard.FlatStyle = FlatStyle.Flat;
buttonKeyboard.Location = new Point(518, 8);
buttonKeyboard.Margin = new Padding(4, 7, 4, 7);
buttonKeyboard.Name = "buttonKeyboard";
buttonKeyboard.Secondary = true;
buttonKeyboard.Size = new Size(249, 45);
buttonKeyboard.TabIndex = 37;
buttonKeyboard.Text = Properties.Strings.Extra;
buttonKeyboard.UseVisualStyleBackColor = false;
comboKeyboard.BorderColor = Color.White;
comboKeyboard.ButtonColor = Color.FromArgb(255, 255, 255);
comboKeyboard.Dock = DockStyle.Top;
comboKeyboard.FlatStyle = FlatStyle.Flat;
comboKeyboard.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboKeyboard.FormattingEnabled = true;
comboKeyboard.ItemHeight = 32;
comboKeyboard.Items.AddRange(new object[] { "Static", "Breathe", "Rainbow", "Strobe" });
comboKeyboard.Location = new Point(4, 10);
comboKeyboard.Margin = new Padding(4, 10, 4, 8);
comboKeyboard.Name = "comboKeyboard";
comboKeyboard.Size = new Size(249, 40);
comboKeyboard.TabIndex = 35;
comboKeyboard.TabStop = false;
//
// pictureKeyboard
//
@@ -1022,7 +1019,7 @@ namespace GHelper
labelKeyboard.Name = "labelKeyboard";
labelKeyboard.Size = new Size(210, 32);
labelKeyboard.TabIndex = 32;
labelKeyboard.Text = Properties.Strings.LaptopKeyboard;
labelKeyboard.Text = "Laptop Keyboard";
//
// SettingsForm
//
@@ -1054,7 +1051,6 @@ namespace GHelper
tableLayoutMatrix.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureMatrix).EndInit();
panelBattery.ResumeLayout(false);
panelBattery.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureBattery).EndInit();
panelFooter.ResumeLayout(false);
panelFooter.PerformLayout();

View File

@@ -41,6 +41,36 @@ namespace GHelper
InitializeComponent();
InitTheme(true);
buttonSilent.Text = Properties.Strings.Silent;
buttonBalanced.Text = Properties.Strings.Balanced;
buttonTurbo.Text = Properties.Strings.Turbo;
buttonFans.Text = Properties.Strings.FansPower;
buttonEco.Text = Properties.Strings.EcoMode;
buttonUltimate.Text = Properties.Strings.UltimateMode;
buttonStandard.Text = Properties.Strings.StandardMode;
buttonOptimized.Text = Properties.Strings.Optimized;
buttonScreenAuto.Text = Properties.Strings.AutoMode;
buttonMiniled.Text = Properties.Strings.Multizone;
buttonKeyboardColor.Text = Properties.Strings.Color;
buttonKeyboard.Text = Properties.Strings.Extra;
labelPerf.Text = Properties.Strings.PerformanceMode;
labelGPU.Text = Properties.Strings.GPUMode;
labelSreen.Text = Properties.Strings.LaptopScreen;
labelKeyboard.Text = Properties.Strings.LaptopKeyboard;
labelMatrix.Text = Properties.Strings.AnimeMatrix;
labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit;
checkMatrix.Text = Properties.Strings.TurnOffOnBattery;
checkStartup.Text = Properties.Strings.RunOnStartup;
buttonMatrix.Text = Properties.Strings.PictureGif;
buttonQuit.Text = Properties.Strings.Quit;
FormClosing += SettingsForm_FormClosing;
buttonSilent.BorderColor = colorEco;
@@ -58,7 +88,6 @@ namespace GHelper
buttonScreenAuto.BorderColor = SystemColors.ActiveBorder;
buttonMiniled.BorderColor = colorTurbo;
buttonOptimized.Click += ButtonOptimized_Click;
buttonSilent.Click += ButtonSilent_Click;
buttonBalanced.Click += ButtonBalanced_Click;
buttonTurbo.Click += ButtonTurbo_Click;
@@ -66,6 +95,7 @@ namespace GHelper
buttonEco.Click += ButtonEco_Click;
buttonStandard.Click += ButtonStandard_Click;
buttonUltimate.Click += ButtonUltimate_Click;
buttonOptimized.Click += ButtonOptimized_Click;
VisibleChanged += SettingsForm_VisibleChanged;
@@ -153,6 +183,44 @@ namespace GHelper
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case NativeMethods.WM_POWERBROADCAST:
if (m.WParam == (IntPtr)NativeMethods.PBT_POWERSETTINGCHANGE)
{
var settings = (NativeMethods.POWERBROADCAST_SETTING)m.GetLParam(typeof(NativeMethods.POWERBROADCAST_SETTING));
switch (settings.Data)
{
case 0:
Logger.WriteLine("Monitor Power Off");
AsusUSB.ApplyBrightness(0);
break;
case 1:
Logger.WriteLine("Monitor Power On");
Program.SetAutoModes();
break;
case 2:
Logger.WriteLine("Monitor Dimmed");
break;
}
}
m.Result = (IntPtr)1;
break;
}
try
{
base.WndProc(ref m);
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
}
public void RunToast(string text, ToastIcon? icon = null)
{
toast.RunToast(text, icon);
@@ -165,36 +233,6 @@ namespace GHelper
Padding padding = new Padding(15, 5, 5, 5);
/*
TableLayoutPanel[] tables = { tablePerf, tableGPU };
string[] titles = { Properties.Strings.PerformanceMode, Properties.Strings.GPUMode};
int index = 0;
foreach (TableLayoutPanel table in tables)
{
var title = new ToolStripMenuItem(titles[index]);
title.Margin = padding;
title.Enabled = false;
contextMenuStrip.Items.Add(title);
foreach (Control control in table.Controls)
{
var button = control as RButton;
if (button != null && !button.Secondary && button.Enabled)
{
var menu = new ToolStripMenuItem(button.Text);
menu.Margin = padding;
menu.Checked = button.Activated;
menu.Click += delegate { button.PerformClick(); };
contextMenuStrip.Items.Add(menu);
}
}
contextMenuStrip.Items.Add("-");
index++;
}*/
var title = new ToolStripMenuItem(Properties.Strings.PerformanceMode);
title.Margin = padding;
title.Enabled = false;
@@ -280,7 +318,7 @@ namespace GHelper
if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)
{
KillGPUApps();
HardwareControl.KillGPUApps();
DialogResult dialogResult = MessageBox.Show("Did you close all applications running on XG Mobile?", "Disabling XG Mobile", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
@@ -493,59 +531,6 @@ namespace GHelper
AutoScreen();
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case NativeMethods.WM_POWERBROADCAST:
if (m.WParam == (IntPtr)NativeMethods.PBT_POWERSETTINGCHANGE)
{
var settings = (NativeMethods.POWERBROADCAST_SETTING)m.GetLParam(typeof(NativeMethods.POWERBROADCAST_SETTING));
switch (settings.Data)
{
case 0:
Logger.WriteLine("Monitor Power Off");
AsusUSB.ApplyBrightness(0);
SetBatteryChargeLimit(AppConfig.getConfig("charge_limit"));
break;
case 1:
Logger.WriteLine("Monitor Power On");
Program.SetAutoModes();
break;
case 2:
Logger.WriteLine("Monitor Dimmed");
break;
}
}
m.Result = (IntPtr)1;
break;
case KeyHandler.WM_HOTKEY_MSG_ID:
Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF);
switch (key)
{
case Keys.VolumeDown:
InputDispatcher.KeyProcess("m1");
break;
case Keys.VolumeUp:
InputDispatcher.KeyProcess("m2");
break;
default:
if (key == InputDispatcher.keyProfile) CyclePerformanceMode();
break;
}
break;
}
base.WndProc(ref m);
}
private void CheckStartup_CheckedChanged(object? sender, EventArgs e)
{
@@ -713,6 +698,17 @@ namespace GHelper
pictureColor.BackColor = AsusUSB.Color1;
pictureColor2.BackColor = AsusUSB.Color2;
pictureColor2.Visible = AsusUSB.HasSecondColor();
if (AppConfig.ContainsModel("GA401"))
{
panelColor.Visible = false;
}
if (AppConfig.ContainsModel("GA401I"))
{
comboKeyboard.Visible = false;
}
}
public void InitMatrix()
@@ -936,31 +932,32 @@ namespace GHelper
HardwareControl.ReadSensors();
if (HardwareControl.cpuTemp > 0)
cpuTemp = ": " + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + "°C ";
cpuTemp = ": " + Math.Round((decimal)HardwareControl.cpuTemp).ToString() + "°C";
if (HardwareControl.batteryDischarge > 0)
battery = Properties.Strings.Discharging + ": " + Math.Round((decimal)HardwareControl.batteryDischarge, 1).ToString() + "W";
if (HardwareControl.gpuTemp > 0)
{
gpuTemp = $": {HardwareControl.gpuTemp}°C ";
gpuTemp = $": {HardwareControl.gpuTemp}°C";
}
Program.settingsForm.BeginInvoke(delegate
{
labelCPUFan.Text = "CPU" + cpuTemp + HardwareControl.cpuFan;
labelGPUFan.Text = "GPU" + gpuTemp + HardwareControl.gpuFan;
labelCPUFan.Text = "CPU" + cpuTemp + " " + HardwareControl.cpuFan;
labelGPUFan.Text = "GPU" + gpuTemp + " " + HardwareControl.gpuFan;
if (HardwareControl.midFan is not null)
labelMidFan.Text = "Mid" + HardwareControl.midFan;
labelBattery.Text = battery;
});
string trayTip = "CPU" + cpuTemp + " " + HardwareControl.cpuFan;
if (gpuTemp.Length > 0) trayTip += "\nGPU" + gpuTemp + " " + HardwareControl.gpuFan;
if (battery.Length > 0) trayTip += "\n" + battery;
Program.trayIcon.Text = "CPU" + cpuTemp + HardwareControl.cpuFan + "\n"
+ "GPU" + gpuTemp + HardwareControl.gpuFan +
((battery.Length > 0) ? ("\n" + battery) : "");
Program.trayIcon.Text = trayTip;
}
@@ -996,6 +993,7 @@ namespace GHelper
int limit_total = AppConfig.getConfigPerf("limit_total");
int limit_cpu = AppConfig.getConfigPerf("limit_cpu");
int limit_fast = AppConfig.getConfigPerf("limit_fast");
if (limit_total > AsusACPI.MaxTotal) return;
if (limit_total < AsusACPI.MinTotal) return;
@@ -1003,6 +1001,10 @@ namespace GHelper
if (limit_cpu > AsusACPI.MaxCPU) return;
if (limit_cpu < AsusACPI.MinCPU) return;
if (limit_fast > AsusACPI.MaxTotal) return;
if (limit_fast < AsusACPI.MinTotal) return;
// SPL + SPPT togeher in one slider
if (Program.acpi.DeviceGet(AsusACPI.PPT_TotalA0) >= 0)
{
Program.acpi.DeviceSet(AsusACPI.PPT_TotalA0, limit_total, "PowerLimit A0");
@@ -1010,11 +1012,17 @@ namespace GHelper
customPower = limit_total;
}
if (Program.acpi.DeviceGet(AsusACPI.PPT_CPUB0) >= 0)
if (Program.acpi.IsAllAmdPPT()) // CPU limit all amd models
{
Program.acpi.DeviceSet(AsusACPI.PPT_CPUB0, limit_cpu, "PowerLimit B0");
customPower = limit_cpu;
}
else if (Program.acpi.DeviceGet(AsusACPI.PPT_APUC1) >= 0) // FPPT boost for non all-amd models
{
Program.acpi.DeviceSet(AsusACPI.PPT_APUC1, limit_fast, "PowerLimit C1");
customPower = limit_fast;
}
Program.settingsForm.BeginInvoke(SetPerformanceLabel);
@@ -1089,14 +1097,21 @@ namespace GHelper
if (AppConfig.getConfigPerf("auto_apply") == 1 || force)
{
bool xgmFan = false;
if (AppConfig.isConfig("xgm_fan") && Program.acpi.IsXGConnected())
{
AsusUSB.SetXGMFan(AppConfig.getFanConfig(AsusFan.XGM));
xgmFan = true;
}
int cpuResult = Program.acpi.SetFanCurve(AsusFan.CPU, AppConfig.getFanConfig(AsusFan.CPU));
int gpuResult = Program.acpi.SetFanCurve(AsusFan.GPU, AppConfig.getFanConfig(AsusFan.GPU));
if (AppConfig.isConfig("mid_fan"))
Program.acpi.SetFanCurve(AsusFan.Mid, AppConfig.getFanConfig(AsusFan.Mid));
if (AppConfig.isConfig("xgm_fan") && Program.acpi.IsXGConnected())
AsusUSB.SetXGMFan(AppConfig.getFanConfig(AsusFan.XGM));
// something went wrong, resetting to default profile
if (cpuResult != 1 || gpuResult != 1)
@@ -1113,7 +1128,7 @@ namespace GHelper
}
// fix for misbehaving bios on intell based TUF 2022
if ((AppConfig.ContainsModel("FX507") || AppConfig.ContainsModel("FX517")) && AppConfig.getConfigPerf("auto_apply_power") != 1)
if ((AppConfig.ContainsModel("FX507") || AppConfig.ContainsModel("FX517") || xgmFan) && AppConfig.getConfigPerf("auto_apply_power") != 1)
{
Task.Run(async () =>
{
@@ -1267,11 +1282,12 @@ namespace GHelper
int backlight = AppConfig.getConfig("keyboard_brightness");
if (AppConfig.isConfig("keyboard_auto") && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online)
if (AppConfig.isConfig("keyboard_auto") && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online)
AsusUSB.ApplyBrightness(0);
else if (backlight >= 0)
else
AsusUSB.ApplyBrightness(backlight);
}
public void AutoPerformance()
@@ -1436,8 +1452,12 @@ namespace GHelper
GpuMode = AsusACPI.GPUModeStandard;
UltimateUI(mux == 1);
if (eco < 0) tableGPU.Visible = false;
if (eco < 0)
{
tableGPU.Visible = false;
if (Program.acpi.DeviceGet(AsusACPI.GPU_Fan) < 0) panelGPU.Visible = false;
}
}
@@ -1496,13 +1516,6 @@ namespace GHelper
}
protected static void KillGPUApps()
{
string[] tokill = { "EADesktop", "RadeonSoftware", "epicgameslauncher" };
foreach (string kill in tokill)
foreach (var process in Process.GetProcessesByName(kill)) process.Kill();
}
public void SetGPUEco(int eco, bool hardWay = false)
{
@@ -1518,19 +1531,17 @@ namespace GHelper
Task.Run(async () =>
{
int status;
int status = 1;
if (eco == 1) KillGPUApps();
if (eco == 1) HardwareControl.KillGPUApps();
Logger.WriteLine($"Running eco command {eco}");
//if (eco == 1) status = 0; else
status = Program.acpi.SetGPUEco(eco);
if (status == 0 && eco == 1 && hardWay)
{
RestartGPU();
}
if (status == 0 && eco == 1 && hardWay) RestartGPU();
await Task.Delay(TimeSpan.FromMilliseconds(500));
await Task.Delay(TimeSpan.FromMilliseconds(100));
Program.settingsForm.BeginInvoke(delegate
{
InitGPUMode();

View File

@@ -1,4 +1,64 @@
<root>
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing"">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
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
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">

View File

@@ -6,6 +6,8 @@ sc config ASUSSwitch start= auto
sc config ASUSSystemAnalysis start= auto
sc config ASUSSystemDiagnosis start= auto
sc config ArmouryCrateControlInterface start= auto
sc config AsusCertService start= auto
sc config ASUSOptimization start= auto
sc START AsusAppService
sc START ASUSLinkNear
@@ -14,6 +16,8 @@ sc START ASUSSoftwareManager
sc START ASUSSwitch
sc START ASUSSystemAnalysis
sc START ASUSSystemDiagnosis
sc START ArmouryCrateControlInterface
sc START ArmouryCrateControlInterface
sc START AsusCertService
sc START ASUSOptimization
set /p asd="Hit enter to finish"

View File

@@ -5,7 +5,9 @@ sc STOP ASUSSoftwareManager
sc STOP ASUSSwitch
sc STOP ASUSSystemAnalysis
sc STOP ASUSSystemDiagnosis
sc STOP ArmouryCrateControlInterface
sc STOP ArmouryCrateControlInterface
sc STOP AsusCertService
sc STOP ASUSOptimization
sc config AsusAppService start= disabled
sc config ASUSLinkNear start= disabled
@@ -15,5 +17,7 @@ sc config ASUSSwitch start= disabled
sc config ASUSSystemAnalysis start= disabled
sc config ASUSSystemDiagnosis start= disabled
sc config ArmouryCrateControlInterface start= disabled
sc config AsusCertService start= disabled
sc config ASUSOptimization start= disabled
set /p asd="Hit enter to finish"

View File

@@ -1,13 +1,11 @@
# G-Helper (GHelper)
[![Github all releases](https://img.shields.io/github/downloads/seerge/g-helper/total.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub release](https://img.shields.io/github/release/seerge/g-helper.svg)](https://GitHub.com/seerge/g-helper/releases/) [![GitHub stars](https://img.shields.io/github/stars/seerge/g-helper.svg?style=social&label=Star)](https://GitHub.com/seerge/g-helper/stargazers/)
Language: English | [中文](https://github.com/seerge/g-helper/blob/main/docs/README.zh-CN.md)
## Lightweight Armoury Crate alternative for Asus laptops
Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models. A small utility that allows you to do almost everything you could do with Armoury Crate but without extra bloat and unnecessary services.
## Control tool for Asus laptops
Lightweight Armoury Crate alternative for Asus lapopts. A small utility that allows you to do almost everything you could do with Armoury Crate but without extra bloat and unnecessary services. Works on all popular models, such as ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar, ProArt and many more! Feel free to try :)
## :gift: Main advantages
@@ -20,11 +18,11 @@ Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix
## [:floppy_disk: Download App](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
If you like this app, please [star :star: it on Github](https://github.com/seerge/g-helper) and spread a word about it!
### [:euro: Donate EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [💵 Donate USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) | [:coin: Donate via Stripe](https://buy.stripe.com/00gaFJ9Lf79v7WobII)
### [:euro: Donate EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [💵 Donate USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) | [:credit_card: Donate via Stripe](https://buy.stripe.com/00gaFJ9Lf79v7WobII)
_If you post about the app - please include a link. Thanks._
![Screenshot 2023-04-13 190951](https://user-images.githubusercontent.com/5920850/231859391-c4963af4-491c-4523-95d4-0bdcfd7cfd6f.png)
![Gihhub](https://github.com/seerge/g-helper/assets/5920850/4d98465a-63a5-4498-ae14-afb3e67e7e82)
### :zap: Main features
@@ -40,6 +38,8 @@ _If you post about the app - please include a link. Thanks._
10. NVidia GPU overclocking
11. XG Mobile Control
![Screenshot 2023-04-13 190951](https://user-images.githubusercontent.com/5920850/231859391-c4963af4-491c-4523-95d4-0bdcfd7cfd6f.png)
### :gear: Automatic switching when on battery or plugged in
- Performance modes (app remembers last mode used on battery or when plugged)
- Optimized GPU mode - disables dGPU on battery and enables when plugged
@@ -58,8 +58,6 @@ Modes are **same** as in Armoury Crate as they are stored in bios including defa
_PPTs are shown for G14 2022, for other models PPTs will be different as they are set in bios._
![Screenshot 2023-05-07 182519](https://user-images.githubusercontent.com/5920850/236697890-26938ac4-8840-4fed-a7b1-9a7b839fb865.png)
### :video_game: GPU Modes
1. Eco mode : only low power integrated GPU enabled, iGPU drives built in display
@@ -67,6 +65,8 @@ _PPTs are shown for G14 2022, for other models PPTs will be different as they ar
3. Ultimate mode: iGPU and dGPU enabled, but dGPU drives built in display (supported only on G14 2022 model)
4. Optimized: disables dGPU on battery (Eco) and enables when plugged (Standard)
![Screenshot 2023-05-07 182519](https://user-images.githubusercontent.com/5920850/236697890-26938ac4-8840-4fed-a7b1-9a7b839fb865.png)
## :question: FAQ
#### How do I stop the Armory Crate install popup appearing every time I press the M4 / Rog key?
@@ -151,6 +151,9 @@ It's a lightweight Armoury Crate alternative for Asus laptops. A small utility t
- Also, it's not recommended to have "ASUS Smart Display Control" app running, as it will try to change refresh rates and fight with g-helper for the same function. You can safely uninstall it.
- It is recommended to run app with windows default "balanced" power plan
![Screenshot 2023-05-29 191650](https://github.com/seerge/g-helper/assets/5920850/27719d96-e9ca-4164-ac4a-23b5966fc0ec)
-------------------------------
Designed and developed for Asus Zephyrus G14 2022 (with AMD Radeon iGPU and dGPU). But could and should potentially work for G14 of 2021 and 2020, G15, X FLOW, and other ROG models for relevant and supported features.