Compare commits

...

35 Commits
v0.66 ... v0.71

Author SHA1 Message Date
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
Serge
f395c706f6 UI tweaks 2023-05-23 20:49:56 +02:00
Serge
444fdcdd97 Backlight fix 2023-05-23 15:27:00 +02:00
Serge
b874900393 French language fixes 2023-05-23 11:14:03 +02:00
Serge
05aad0f1ad Matrix tweaks 2023-05-23 10:58:27 +02:00
Serge
a34cc1cb03 Animatrix clock fix 2023-05-22 21:57:21 +02:00
Serge
8c557344db Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-22 17:57:08 +02:00
Serge
5b2a4cb065 UI tweaks 2023-05-22 17:57:06 +02:00
Serge
51bcad8bbe Merge pull request #434 from marcelomijas/main
Spanish translation of new key functions
2023-05-22 16:26:13 +02:00
Marcelo Moreno
125aa44e6c Spanish translation of new key functions 2023-05-22 16:21:58 +02:00
Serge
9e6ca7c2e2 Bumped version to 0.67 2023-05-22 16:15:24 +02:00
Serge
252cc9d868 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-22 13:31:03 +02:00
Serge
0b03b62a2d Extended support for Z13 external keyboard 2023-05-22 13:31:01 +02:00
Serge
ff7a5463d6 Update README.md 2023-05-22 11:44:10 +02:00
Serge
5134aaca9d Native brightness OSD 2023-05-22 11:18:57 +02:00
Serge
2a5c2e02ac Anime matrix fix 2023-05-21 21:23:55 +02:00
25 changed files with 1291 additions and 449 deletions

View File

@@ -10,22 +10,23 @@ namespace GHelper.AnimeMatrix
public class AniMatrix
{
static System.Timers.Timer matrixTimer = default!;
static AnimeMatrixDevice mat;
System.Timers.Timer matrixTimer = default!;
AnimeMatrixDevice mat;
static double[] AudioValues;
static WasapiCapture AudioDevice;
double[] AudioValues;
WasapiCapture AudioDevice;
public static bool IsValid => mat != null;
public bool IsValid => mat != null;
private static long lastPresent;
private static List<double> maxes = new List<double>();
private long lastPresent;
private List<double> maxes = new List<double>();
public AniMatrix()
{
try
{
mat = new AnimeMatrixDevice();
Task.Run(mat.WakeUp);
matrixTimer = new System.Timers.Timer(100);
matrixTimer.Elapsed += MatrixTimer_Elapsed;
}
@@ -77,8 +78,7 @@ namespace GHelper.AnimeMatrix
SetMatrixPicture(AppConfig.getConfigString("matrix_picture"));
break;
case 3:
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
SetMatrixClock();
break;
case 4:
SetMatrixAudio();
@@ -94,21 +94,21 @@ namespace GHelper.AnimeMatrix
}
}
private static void StartMatrixTimer(int interval = 100)
private void StartMatrixTimer(int interval = 100)
{
matrixTimer.Interval = interval;
matrixTimer.Enabled = true;
matrixTimer.Start();
}
private static void StopMatrixTimer()
private void StopMatrixTimer()
{
matrixTimer.Enabled = false;
matrixTimer.Stop();
}
private static void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
{
if (!IsValid) return;
//if (!IsValid) return;
switch (AppConfig.getConfig("matrix_running"))
{
@@ -122,6 +122,19 @@ namespace GHelper.AnimeMatrix
}
public void SetMatrixClock()
{
mat.SetBuiltInAnimation(false);
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
}
public void Dispose()
{
StopMatrixAudio();
}
void StopMatrixAudio()
{
if (AudioDevice is not null)

View File

@@ -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,5 +1,4 @@
using System.Diagnostics;
using System.Management;
using System.Management;
using System.Runtime.InteropServices;
public enum AsusFan
@@ -32,6 +31,7 @@ public class AsusACPI
const uint DSTS = 0x53545344;
const uint DEVS = 0x53564544;
const uint INIT = 0x54494E49;
public const uint UniversalControl = 0x00100021;
public const int KB_Light_Up = 0xc4;
@@ -161,7 +161,7 @@ public class AsusACPI
public void RunListener()
{
eventHandle = CreateEvent(IntPtr.Zero, false, false, "ATK Event");
eventHandle = CreateEvent(IntPtr.Zero, false, false, "ATK4001");
byte[] outBuffer = new byte[16];
byte[] data = new byte[8];
@@ -171,14 +171,14 @@ public class AsusACPI
data[1] = BitConverter.GetBytes(eventHandle.ToInt32())[1];
result = Control(0x222400, data, outBuffer);
Debug.WriteLine(result + ":" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));
Logger.WriteLine("ACPI " + result + ":" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));
while (true)
{
WaitForSingleObject(eventHandle, Timeout.Infinite);
Control(0x222408, new byte[0], outBuffer);
int code = BitConverter.ToInt32(outBuffer);
Logger.WriteLine("Code: " + code);
Logger.WriteLine("ACPI Code: " + code);
}
}
@@ -240,6 +240,13 @@ public class AsusACPI
}
public byte[] DeviceInit()
{
byte[] args = new byte[8];
return CallMethod(INIT, args);
}
public int DeviceSet(uint DeviceID, int Status, string logName)
{
byte[] args = new byte[8];

View File

@@ -1,6 +1,4 @@
using HidLibrary;
using Microsoft.Win32;
using System.Diagnostics;
using System.Text;
namespace GHelper
@@ -54,16 +52,19 @@ namespace GHelper
public static class AsusUSB
{
public const byte HID_ID = 0x5a;
public const int ASUS_ID = 0x0b05;
public static readonly byte[] LED_INIT1 = new byte[] { 0x5d, 0xb9 };
public const byte INPUT_HID_ID = 0x5a;
public const byte AURA_HID_ID = 0x5d;
public static readonly byte[] LED_INIT1 = new byte[] { AURA_HID_ID, 0xb9 };
public static readonly byte[] LED_INIT2 = Encoding.ASCII.GetBytes("]ASUS Tech.Inc.");
public static readonly byte[] LED_INIT3 = new byte[] { 0x5d, 0x05, 0x20, 0x31, 0, 0x08 };
public static readonly byte[] LED_INIT3 = new byte[] { AURA_HID_ID, 0x05, 0x20, 0x31, 0, 0x08 };
public static readonly byte[] LED_INIT4 = Encoding.ASCII.GetBytes("^ASUS Tech.Inc.");
public static readonly byte[] LED_INIT5 = new byte[] { 0x5e, 0x05, 0x20, 0x31, 0, 0x08 };
static byte[] MESSAGE_SET = { 0x5d, 0xb5, 0, 0, 0 };
static byte[] MESSAGE_APPLY = { 0x5d, 0xb4 };
static byte[] MESSAGE_SET = { AURA_HID_ID, 0xb5, 0, 0, 0 };
static byte[] MESSAGE_APPLY = { AURA_HID_ID, 0xb4 };
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0, 0x18c6 };
@@ -173,66 +174,44 @@ 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(0x0b05, deviceIds).ToArray();
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;
}
private static HidDevice? GetInputDevice()
public static HidDevice? GetDevice(byte reportID = INPUT_HID_ID)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
HidDevice input = null;
foreach (HidDevice device in HidDeviceList)
if (device.ReadFeatureData(out byte[] data, HID_ID))
return device;
return null;
}
public static void TouchpadToggle()
{
HidDevice? input = GetInputDevice();
if (input != null) input.WriteFeatureData(new byte[] { HID_ID,0xf4,0x6b});
}
public static void RunListener(Action<int> KeyHandler)
{
HidDevice? input = GetInputDevice();
if (input == null) return;
Logger.WriteLine("Input Events " + input.DevicePath);
var task = Task.Run(() =>
{
try
if (device.ReadFeatureData(out byte[] data, reportID))
{
while (true)
{
var data = input.Read().Data;
if (data.Length > 1 && data[0] == HID_ID && data[1] > 0)
{
Logger.WriteLine("Key:" + data[1]);
KeyHandler(data[1]);
}
}
input = device;
//Logger.WriteLine("HID Device("+ reportID + ")" + + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.DevicePath);
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
});
return input;
}
public static bool TouchpadToggle()
{
HidDevice? input = GetDevice();
if (input != null) return input.WriteFeatureData(new byte[] { INPUT_HID_ID, 0xf4, 0x6b });
return false;
}
public static byte[] AuraMessage(int mode, Color color, Color color2, int speed)
{
byte[] msg = new byte[17];
msg[0] = 0x5d;
msg[0] = AURA_HID_ID;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
@@ -249,45 +228,61 @@ namespace GHelper
public static void Init()
{
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
Task.Run(async () =>
{
device.OpenDevice();
device.WriteFeatureData(LED_INIT1);
device.WriteFeatureData(LED_INIT2);
device.WriteFeatureData(LED_INIT3);
device.WriteFeatureData(LED_INIT4);
device.WriteFeatureData(LED_INIT5);
device.CloseDevice();
}
var devices = GetHidDevices(deviceIds, 0);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(LED_INIT1);
device.WriteFeatureData(LED_INIT2);
device.WriteFeatureData(LED_INIT3);
device.WriteFeatureData(LED_INIT4);
device.WriteFeatureData(LED_INIT5);
device.CloseDevice();
}
});
}
public static void ApplyBrightness(int brightness)
{
byte[] msg = { 0x5d, 0xba, 0xc5, 0xc4, (byte)brightness };
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(LED_INIT1);
device.WriteFeatureData(LED_INIT2);
device.WriteFeatureData(LED_INIT3);
device.WriteFeatureData(LED_INIT4);
device.WriteFeatureData(LED_INIT5);
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Capabilities.FeatureReportByteLength + ":" + BitConverter.ToString(msg));
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
Task.Run(async () =>
{
byte[] msg = { AURA_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
var devices = GetHidDevices(deviceIds);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(msg);
Logger.WriteLine("KB Backlight:" + BitConverter.ToString(msg));
device.CloseDevice();
}
// 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();
}
}
});
}
@@ -317,49 +312,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()
{
@@ -404,21 +356,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);
}

49
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,7 @@ namespace GHelper
checkSleepLid = new CheckBox();
checkShutdownLid = new CheckBox();
groupOther = new GroupBox();
checkGpuApps = new CheckBox();
checkAutoApplyWindowsPowerMode = new CheckBox();
checkKeyboardAuto = new CheckBox();
checkUSBC = new CheckBox();
@@ -91,6 +94,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 +306,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 +324,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 +684,34 @@ namespace GHelper
//
// groupOther
//
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, 310);
groupOther.TabIndex = 2;
groupOther.TabStop = false;
groupOther.Text = "Other";
//
// checkGpuApps
//
checkGpuApps.AutoSize = true;
checkGpuApps.Location = new Point(25, 220);
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, 268);
checkAutoApplyWindowsPowerMode.Name = "checkAutoApplyWindowsPowerMode";
checkAutoApplyWindowsPowerMode.Size = new Size(416, 36);
checkAutoApplyWindowsPowerMode.TabIndex = 47;
@@ -732,7 +765,7 @@ namespace GHelper
AutoScaleMode = AutoScaleMode.Font;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(974, 1131);
ClientSize = new Size(974, 1220);
Controls.Add(groupOther);
Controls.Add(groupLight);
Controls.Add(groupBindings);
@@ -754,6 +787,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 +856,8 @@ namespace GHelper
private RComboBox comboM2;
private TextBox textM2;
private TextBox textM1;
private NumericUpDown numericBacklightPluggedTime;
private Label labelBacklightTimeoutPlugged;
private CheckBox checkGpuApps;
}
}

View File

@@ -84,7 +84,9 @@ 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;
@@ -97,6 +99,8 @@ namespace GHelper
labelBacklightLid.Text = Properties.Strings.Lid;
labelBacklightLogo.Text = Properties.Strings.Logo;
checkGpuApps.Text = Properties.Strings.KillGpuApps;
Text = Properties.Strings.ExtraSettings;
InitTheme();
@@ -209,18 +213,27 @@ 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;
}
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)
@@ -319,7 +332,15 @@ namespace GHelper
private void Keyboard_Shown(object? sender, EventArgs e)
{
Top = Program.settingsForm.Top;
if (Height > Program.settingsForm.Height)
{
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
}
else
{
Top = Program.settingsForm.Top;
}
Left = Program.settingsForm.Left - Width - 5;
}

View File

@@ -303,7 +303,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;
}
@@ -466,7 +466,6 @@ namespace GHelper
chartMid.Visible = true;
SetChart(chartMid, AsusFan.Mid);
LoadProfile(seriesMid, AsusFan.Mid);
MinimumSize = new Size(0, chartCount * 400 + 200);
}
else
{
@@ -481,13 +480,22 @@ 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.66</AssemblyVersion>
<AssemblyVersion>0.71</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">

View File

@@ -1,4 +1,5 @@
using NvAPIWrapper.GPU;
using NvAPIWrapper;
using NvAPIWrapper.GPU;
using NvAPIWrapper.Native;
using NvAPIWrapper.Native.Delegates;
using NvAPIWrapper.Native.GPU;
@@ -35,8 +36,7 @@ public class NvidiaGpuControl : IGpuControl
public int? GetCurrentTemperature()
{
if (!IsValid)
return null;
if (!IsValid) return null;
PhysicalGPU internalGpu = _internalGpu!;
IThermalSensor? gpuSensor =
@@ -50,6 +50,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)
{
@@ -182,7 +214,7 @@ public class NvidiaGpuControl : IGpuControl
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
Debug.WriteLine(ex.Message);
return null;
}
}

View File

@@ -41,7 +41,7 @@ public static class HardwareControl
if (fan > fanMax && fan < 110) SetFanMax(fan);
if (AppConfig.getConfig("fan_rpm") == 1)
return GHelper.Properties.Strings.FanSpeed + (fan * 100).ToString() + GHelper.Properties.Strings.RPM;
return GHelper.Properties.Strings.FanSpeed + (fan * 100).ToString() + "RPM";
else
return GHelper.Properties.Strings.FanSpeed + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
}
@@ -151,9 +151,11 @@ public static class HardwareControl
GpuControl?.Dispose();
IGpuControl _gpuControl = new NvidiaGpuControl();
if (_gpuControl.IsValid)
{
GpuControl = _gpuControl;
Logger.WriteLine(GpuControl.FullName);
return;
}
@@ -163,11 +165,14 @@ public static class HardwareControl
if (_gpuControl.IsValid)
{
GpuControl = _gpuControl;
Logger.WriteLine(GpuControl.FullName);
return;
}
_gpuControl.Dispose();
GpuControl = null;
}
catch (Exception ex)
{

View File

@@ -1,65 +1,161 @@
using Microsoft.Win32;
using HidLibrary;
using Microsoft.Win32;
using NAudio.CoreAudioApi;
using System.Collections.Generic;
using System.Diagnostics;
using System.Management;
using Tools;
using static NativeMethods;
namespace GHelper
{
public class InputDispatcher
public class KeyboardListener
{
private static bool isOptimizationRunning = OptimizationService.IsRunning();
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
public KeyboardListener(Action<int> KeyHandler)
{
HidDevice? input = AsusUSB.GetDevice();
if (input == null) return;
Logger.WriteLine($"Input: {input.DevicePath}");
var task = Task.Run(() =>
{
try
{
while (!cancellationTokenSource.Token.IsCancellationRequested)
{
var data = input.Read().Data;
if (data.Length > 1 && data[0] == AsusUSB.INPUT_HID_ID && data[1] > 0)
{
Logger.WriteLine($"Key: {data[1]}");
KeyHandler(data[1]);
}
}
Logger.WriteLine("Listener stopped");
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
});
}
public void Dispose()
{
cancellationTokenSource?.Cancel();
}
}
public class InputDispatcher
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
public bool backlight = true;
private static nint windowHandle;
public static Keys keyProfile = Keys.F5;
public static Keys keyApp = Keys.F12;
KeyHandler m1, m2, togggle;
KeyboardListener listener;
KeyHandler m1, m2, handlerProfile, handlerApp;
public InputDispatcher(nint handle)
{
windowHandle = handle;
Program.acpi.SubscribeToEvents(WatcherEventArrived);
byte[] result = Program.acpi.DeviceInit();
Debug.WriteLine($"Init: {BitConverter.ToString(result)}");
if (!isOptimizationRunning) AsusUSB.RunListener(HandleEvent);
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);
handlerProfile = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, keyProfile, windowHandle);
handlerApp = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, keyApp, windowHandle);
m1 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeDown, windowHandle);
m2 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeUp, windowHandle);
RegisterKeys();
timer.Elapsed += Timer_Elapsed;
}
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()
{
string actionM1 = AppConfig.getConfigString("m1");
string actionM2 = AppConfig.getConfigString("m2");
togggle.Unregiser();
handlerProfile.Unregiser();
m1.Unregiser();
m2.Unregiser();
if (keyProfile != Keys.None)
{
togggle.Register();
}
if (keyProfile != Keys.None) handlerProfile.Register();
if (keyApp != Keys.None) handlerApp.Register();
if (actionM1 is not null && actionM1.Length > 0)
{
m1.Register();
}
if (actionM1 is not null && actionM1.Length > 0) m1.Register();
if (actionM2 is not null && actionM2.Length > 0)
{
m2.Register();
}
if (actionM2 is not null && actionM2.Length > 0) m2.Register();
}
@@ -97,7 +193,7 @@ namespace GHelper
action = "aura";
if (name == "fnf5")
action = "performance";
if (name == "m3" && !isOptimizationRunning)
if (name == "m3" && !OptimizationService.IsRunning())
action = "micmute";
}
@@ -181,6 +277,7 @@ namespace GHelper
Program.settingsForm.BeginInvoke(Program.settingsForm.CyclePerformanceMode);
return;
case 179: // FN+F4
case 178: // FN+F4
KeyProcess("fnf4");
return;
case 189: // Tablet mode
@@ -188,16 +285,13 @@ namespace GHelper
return;
}
if (isOptimizationRunning) return;
if (OptimizationService.IsRunning()) return;
// Asus Optimization service Events
int backlight = AppConfig.getConfig("keyboard_brightness");
string[] backlightNames = new string[] { "Off", "Low", "Mid", "Max" };
int brightness;
switch (EventID)
{
case 197: // FN+F2
@@ -212,13 +306,17 @@ namespace GHelper
AsusUSB.ApplyBrightness(backlight);
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, backlightNames[backlight], ToastIcon.BacklightUp);
break;
case 199: // ON Z13 - FN+F11 - cycles backlight
if (++backlight > 3) backlight = 0;
AppConfig.setConfig("keyboard_brightness", backlight);
AsusUSB.ApplyBrightness(backlight);
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, backlightNames[backlight], ToastIcon.BacklightUp);
break;
case 16: // FN+F7
brightness = ScreenBrightness.Adjust(-10);
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, brightness + "%", ToastIcon.BrightnessDown);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x10, "Brightness");
break;
case 32: // FN+F8
brightness = ScreenBrightness.Adjust(+10);
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, brightness + "%", ToastIcon.BrightnessUp);
Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x20, "Brightness");
break;
case 107: // FN+F10
bool touchpadState = GetTouchpadState();
@@ -235,11 +333,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

View File

@@ -2,6 +2,7 @@
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;
using static Tools.ScreenInterrogatory;
namespace Tools
@@ -351,6 +352,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;
@@ -709,6 +729,7 @@ public class NativeMethods
dm.dmDisplayFrequency = frequency;
int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet));
return iRet;
}

View File

@@ -1,6 +1,7 @@
using System.Text.RegularExpressions;
using System.Text;
using System.Diagnostics;
using Microsoft.Win32;
namespace GHelper
{
@@ -39,6 +40,26 @@ 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

@@ -1,11 +1,8 @@
using Microsoft.Win32;
using NAudio.CoreAudioApi;
using System.Diagnostics;
using System.Globalization;
using System.Management;
using System.Reflection;
using System.Security.Principal;
using Tools;
using static NativeMethods;
namespace GHelper
@@ -32,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)
@@ -41,10 +38,15 @@ namespace GHelper
string action = "";
if (args.Length > 0) action = args[0];
Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentUICulture;
Debug.WriteLine(CultureInfo.CurrentUICulture);
string language = AppConfig.getConfigString("language");
//Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("es");
if (language != null && language.Length > 0)
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(language);
else
Thread.CurrentThread.CurrentUICulture = CultureInfo.CurrentUICulture;
Debug.WriteLine(CultureInfo.CurrentUICulture);
//Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture("fr");
CheckProcesses();
@@ -65,7 +67,7 @@ namespace GHelper
}
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + (IsUserAdministrator() ? "A" : ""));
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (IsUserAdministrator() ? "." : ""));
Application.EnableVisualStyles();
@@ -81,7 +83,7 @@ namespace GHelper
settingsForm.InitMatrix();
settingsForm.SetStartupCheck(Startup.IsScheduled());
SetAutoModes();
// Subscribing for system power change events
@@ -98,7 +100,7 @@ namespace GHelper
SettingsToggle(action);
}
Application.Run();
@@ -142,6 +144,8 @@ namespace GHelper
isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
Logger.WriteLine("AutoSetting for " + isPlugged.ToString());
inputDispatcher.Init();
settingsForm.SetBatteryChargeLimit(AppConfig.getConfig("charge_limit"));
settingsForm.AutoPerformance();
@@ -159,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

@@ -169,7 +169,7 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized string similar to Auto adjust Windows Power Mode.
/// Looks up a localized string similar to Auto adjust Windows Power Modes.
/// </summary>
internal static string ApplyWindowsPowerPlan {
get {
@@ -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 {
@@ -618,6 +627,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,7 @@
<value>Encendida</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Apagar retroiluminación con batería (s.)</value>
<value>Apagar retroiluminación con batería (segundos)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
@@ -357,6 +357,9 @@
<data name="Multizone" xml:space="preserve">
<value>Multizona</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Silenciar micrófono</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Abrir ventana G-Helper</value>
</data>
@@ -450,9 +453,15 @@
<data name="VersionLabel" xml:space="preserve">
<value>Versión</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Bajar volumen</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Silenciar volumen</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Subir volumen</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Mantener aplicación siempre visible</value>
</data>

View File

@@ -1,5 +1,64 @@
<?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">
@@ -59,13 +118,13 @@
<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>Connexion impossible avec ASUS ACPI. Lapplication ne peut fonctionner sans. Veuillez installer Asus System Control Interface.</value>
<value>Connexion impossible avec ASUS ACPI. L'application ne peut fonctionner sans. Veuillez installer Asus System Control Interface.</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Le GPU semble être surchargé, voulez vous le désactiver ?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Mode Économique</value>
<value>Mode Éco</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Désactiver le Mode Ultime requiert un redémarrage</value>
@@ -77,28 +136,28 @@
<value>Redémarrer maintenant ?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Vitesse danimation</value>
<value>Vitesse de l'animation</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>Anime Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>Lapplication est déjà en cours déxecution</value>
<value>L'application est déjà en cours d'exécution</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper est déjà en cours d'exécution. Vérifiez la barre d'état du système</value>
<value>G-Helper est déjà en cours d'exécution. Vérifiez la barre d'état système.</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Appliquer la courbe de ventilateur personnalisée</value>
<value>Appliquer la courbe</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Appliquer les limites de performance</value>
<value>Appliquer les limites</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajuster automatiquement les modes de Performance Windows</value>
<value>Ajustement auto des modes de gestion alim. Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Respiration</value>
<value>Pulsation</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Cycle de couleur</value>
@@ -125,19 +184,25 @@
<value>Automatique</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Limiter le rafraîchissement de lécran à 60Hz pour économiser de la batterie, et retour à la normal en chargement</value>
<value>Limite à 60 Hz pour éco. batterie, valeur normale sur secteur</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Éveillé</value>
<value>Allumé</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Délai (secondes) avant extinction rétroéclairage</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balancé</value>
<value>Équilibré</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de charge de la batterie</value>
<value>Limite de charge </value>
</data>
<data name="Boot" xml:space="preserve">
<value>Au lancement</value>
<value>Au démarrage</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
</data>
<data name="Color" xml:space="preserve">
<value>Couleur</value>
@@ -152,25 +217,25 @@
<value>Par défaut</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Désactiver lOverdrive de l’Écran</value>
<value>Désactiver l'overdrive de lcran</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>En déchargement</value>
<value>Taux décharge </value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Télécharger la mise à jour</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Désactive le dGPU pour économiser la batterie</value>
<value>Désactive le dGPU pour préserver la batterie</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Économique</value>
<value>Éco</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Aditionnel</value>
<value>+ d'options</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Paramètres additionnels</value>
<value>Paramètres supplémentaires</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Paramètres d'usine</value>
@@ -179,37 +244,55 @@
<value>Courbes des ventilateurs</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Profil de ventilateur CPU</value>
<value>Profil du ventilateur CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Profil de ventilateur GPU</value>
<value>Profil du ventilateur GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Profil de ventilateur central</value>
<value>Profil du ventilateur central</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Profil des ventilateurs </value>
<value>Profil</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Ventilateurs et Puissance</value>
<value>Ventilateurs + Puissance</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Vent: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Ventilateurs + Puissance</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Changement</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Ajustement fréq. de base</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Ajustement fréq. mémoire</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Mode de GPU</value>
<value>Mode GPU </value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>Seulement iGPU</value>
<value>iGPU uniquement</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>Exclusivement dGPU</value>
<value>dGPU exclusif</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Paramètres du GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Température cible</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Raccourcis clavier</value>
@@ -218,16 +301,28 @@
<value>Clavier</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Baisser la luminosité du rétroéclairage sur batterie et retour à la normal en charge</value>
<value>Réduire rétroéclairage sur batterie et mode normal sur secteur</value>
</data>
<data name="KeyboardBacklight" xml:space="preserve">
<value>Rétroéclairage du clavier</value>
<data name="LaptopBacklight" xml:space="preserve">
<value>Rétroéclairage de l'ordinateur</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Clavier de lordinateur</value>
<value>Clavier de l'ordinateur</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Écran de lordinateur</value>
<value>Écran de l'ordinateur </value>
</data>
<data name="Lid" xml:space="preserve">
<value>Capot</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Barre lumineuse</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualiseur Audio</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Bannière binaire</value>
@@ -251,25 +346,31 @@
<value>Éteint</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Image</value>
<value>Images</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Rafraichissement maximum pour baisser la latance</value>
<value>Rafraîchissement maximum, faible latence</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>Rafraichissement à 60Hz pour économiser de la batterie</value>
<value>Rafraichîssement 60 Hz pour économiser de la batterie</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizone</value>
<value>Multi-zone</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Désactiver le micro</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Ouvrir la fenêtre G-Helper</value>
<value>Ouvrir G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Optimizé</value>
<value>Optimisé</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Passer en Économique sur batterie et sur Standard en chargement</value>
<value>Éco sur batterie, bascule vers Standard sur secteur</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Garder le GPU désactivé lorsque branché via USB-C en mode Optimisé</value>
</data>
<data name="Other" xml:space="preserve">
<value>Autre</value>
@@ -284,34 +385,37 @@
<value>Image / Gif</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Reproduire / Pause</value>
<value>Lecture / Pause</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Limites de puissance (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Limites de puissance (PPT) est une fonctionnalité expérimentale. Utilisez la avec attention et à vos risques.</value>
<value>Limites de puissance (PPT) est une fonctionnalité expérimentale. Faire attention, à utiliser à vos risques !</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>Capture d’Écran</value>
<value>Capture dcran</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Quitter</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Un processus utilisant le dGPU empêche le passage en mode Éco. Redémarrer le dGPU ? * Procédez à vos risques.</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
<value> RPM</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Executer au lancement</value>
<value>Exécuter au démarrage</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Éteindre</value>
<value>Arrêter</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Silencieux</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>En veille</value>
<value>Veille</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Active le dGPU pour une utilisation standard</value>
@@ -323,7 +427,13 @@
<value>Erreur au lancement</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Basculer Aura</value>
<value>Activer Aura</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Activer Miniled (si supporté)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Allumer l'écran</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
@@ -335,66 +445,24 @@
<value>Éteindre sur batterie</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Redirige lécran de lordinateur sur le dGPU pour maximiser le nombre de FPS</value>
<value>Redirige l'écran du portable vers le dGPU, maximisation taux FPS </value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
<value>Ultime</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Version</value>
<value>Version </value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Vol-</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Mettre en sourdine</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Vol+</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Garder lapplication au premier plan</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Ventilateurs :</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Boost Dynamique</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Augmentation de la fréquence de base</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Augmentation de la fréquence de la mémoire</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Paramêtres de GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Température ciblée</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Rétroéclairage de lordinateur</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Capot</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Barre de lumière</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Garder le GPU désactivé en chargement via USB-C dans le mode Optimisé</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Un processus utilise le dGPU est empêche le passage en mode Économique. Redémarrer le dGPU dans le gestionnaire de périphérique ? * Veuillez procéder à vos risques</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Basculer sur Miniled (si supporté)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Basculer décran</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Nombre de secondes avant déteindre le rétroéclairage sur batterie</value>
<value>Maintenir la fenêtre au premier plan</value>
</data>
</root>

View File

@@ -154,7 +154,7 @@
<value>Apply Power Limits</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto adjust Windows Power Mode</value>
<value>Auto adjust Windows Power Modes</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
@@ -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,7 +262,7 @@
<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>
@@ -303,6 +306,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

@@ -154,7 +154,7 @@
<value>Застосувати потужність</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Автоматично застосовувати Windows Power Mode</value>
<value>Автоматично застосовувати Windows Power Modes</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Дихання</value>
@@ -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>
@@ -324,6 +330,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 +342,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 +399,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 +423,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

@@ -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;

View File

@@ -93,8 +93,6 @@ namespace GHelper
comboMatrix.DropDownClosed += ComboMatrix_SelectedValueChanged;
comboMatrixRunning.DropDownClosed += ComboMatrixRunning_SelectedValueChanged;
checkMatrix.CheckedChanged += CheckMatrix_CheckedChanged; ;
buttonMatrix.Click += ButtonMatrix_Click;
checkStartup.CheckedChanged += CheckStartup_CheckedChanged;
@@ -155,6 +153,64 @@ 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;
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();
if (key == InputDispatcher.keyApp) Program.SettingsToggle();
break;
}
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);
@@ -167,36 +223,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;
@@ -282,8 +308,13 @@ namespace GHelper
if (Program.acpi.DeviceGet(AsusACPI.GPUXG) == 1)
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, "GPU XGM");
await Task.Delay(TimeSpan.FromSeconds(15));
KillGPUApps();
DialogResult dialogResult = MessageBox.Show("Did you close all applications running on XG Mobile?", "Disabling XG Mobile", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
Program.acpi.DeviceSet(AsusACPI.GPUXG, 0, "GPU XGM");
await Task.Delay(TimeSpan.FromSeconds(15));
}
}
else
{
@@ -490,58 +521,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");
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)
{
@@ -716,7 +695,7 @@ namespace GHelper
matrix = new AniMatrix();
if (!AniMatrix.IsValid)
if (!matrix.IsValid)
{
panelMatrix.Visible = false;
return;
@@ -729,7 +708,7 @@ namespace GHelper
comboMatrixRunning.SelectedIndex = (running != -1) ? Math.Min(running, comboMatrixRunning.Items.Count - 1) : 0;
checkMatrix.Checked = (AppConfig.getConfig("matrix_auto") == 1);
checkMatrix.CheckedChanged += CheckMatrix_CheckedChanged;
}
@@ -889,6 +868,7 @@ namespace GHelper
private void ButtonQuit_Click(object? sender, EventArgs e)
{
matrix.Dispose();
Close();
Program.trayIcon.Visible = false;
Application.Exit();
@@ -952,10 +932,11 @@ namespace GHelper
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;
}
@@ -1260,13 +1241,12 @@ namespace GHelper
{
AsusUSB.Init();
if (AppConfig.getConfig("keyboard_auto") != 1) return;
int backlight = AppConfig.getConfig("keyboard_brightness");
if (SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online)
AsusUSB.ApplyBrightness(3);
else
if (AppConfig.isConfig("keyboard_auto") && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online)
AsusUSB.ApplyBrightness(0);
else if (backlight >= 0)
AsusUSB.ApplyBrightness(backlight);
}
@@ -1305,7 +1285,7 @@ namespace GHelper
bool optimizedUSBC = AppConfig.getConfig("optimized_usbc") != 1;
return SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online &&
(optimizedUSBC || Program.acpi.DeviceGet(AsusACPI.ChargerMode) != AsusACPI.ChargerUSB);
(optimizedUSBC || Program.acpi.DeviceGet(AsusACPI.ChargerMode) < AsusACPI.ChargerUSB);
}
@@ -1433,6 +1413,12 @@ namespace GHelper
UltimateUI(mux == 1);
if (eco < 0)
{
tableGPU.Visible = false;
if (Program.acpi.DeviceGet(AsusACPI.GPU_Fan) < 0) panelGPU.Visible = false;
}
}
AppConfig.setConfig("gpu_mode", GpuMode);
@@ -1490,6 +1476,20 @@ 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();
if (AppConfig.isConfig("kill_gpu_apps") && HardwareControl.GpuControl is not null && HardwareControl.GpuControl.IsNvidia)
{
NvidiaGpuControl nvControl = (NvidiaGpuControl)HardwareControl.GpuControl;
nvControl.KillGPUApps();
}
}
public void SetGPUEco(int eco, bool hardWay = false)
{
@@ -1506,12 +1506,7 @@ namespace GHelper
int status;
if (eco == 1)
{
string[] tokill = { "EADesktop", "RadeonSoftware" };
foreach (string kill in tokill)
foreach (var process in Process.GetProcessesByName(kill)) process.Kill();
}
if (eco == 1) KillGPUApps();
//if (eco == 1) status = 0; else
status = Program.acpi.SetGPUEco(eco);

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

@@ -4,9 +4,9 @@
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 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.
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 +20,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
@@ -48,6 +48,8 @@ _If you post about the app - please include a link. Thanks._
To keep auto switching and hotkeys working the app needs to stay running in the tray. It doesn't consume any resources.
![Screenshot 2023-05-07 182519](https://user-images.githubusercontent.com/5920850/236697890-26938ac4-8840-4fed-a7b1-9a7b839fb865.png)
### :rocket: Performance Modes
Modes are **same** as in Armoury Crate as they are stored in bios including default fan curves
@@ -58,8 +60,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 +67,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-04-13 190951](https://user-images.githubusercontent.com/5920850/231859391-c4963af4-491c-4523-95d4-0bdcfd7cfd6f.png)
## :question: FAQ
#### How do I stop the Armory Crate install popup appearing every time I press the M4 / Rog key?
@@ -101,13 +103,11 @@ Open "Event Viewer" from start menu, go to Windows Logs -> Application and check
#### Battery charge limiter is not working
Open application log.text from ``%AppData%\GHelper`` . If you see something like ``BatteryLimit = 60 : OK`` there (with your selected limit). App has done everything it could to set a limit. It could be that MyASUS or other Asus services are overwriting this limit after. You may want to right click and save this [debloat.bat](https://raw.githubusercontent.com/seerge/g-helper/main/debloat.bat) and then right-click Run it As Admin. It will stop not mandatory asus services.
What you can also try is to open ``C:\ProgramData\ASUS\ASUS System Control Interface\ASUSOptimization\Customization.ini`` and find following section from that file : ``[BatteryHealthCharging] ... value=100`` and either delete it or put same value as you use in G-helper.
#### Can I use MyASUS app along with G-Helper?
You can, the only problem is that MyASUS may override the battery charge limit that you set before. My advice in such a situation would be to set the same limit (i.e. 80%) in both MyASUS and G-Helper.
#### How do I set Mute Microphone to M3?
This function is handled by Asus Optimization Service (therefore G-helper doesn't interfere and doesn't touch this function). Make sure that this service is up and running
If you have Asus Optimization Service running, it's controlled by that service (therefore G-helper doesn't interfere and doesn't touch this function). Alternatively you can stop that service - and you can bind M3 to anything you want.
#### How do I set different "Visual styles"?
Personally, i'm not a big fan of them, as they make colors very inaccurate. But if you want so - you can adjust display colors using either Nvidia Control panel or AMD Adrenaline (appropriate display sections). If you really want you can also use [own ASUS utility from MS Store](https://apps.microsoft.com/store/detail/gamevisual/9P4K1LFTXSH8?hl=nl-nl&gl=nl&rtc=1)
@@ -147,9 +147,7 @@ It's a lightweight Armoury Crate alternative for Asus laptops. A small utility t
### Recommendations (optional)
- I recommend keeping "Asus Optimization Service" running, as it keeps basic laptop hotkeys such as screen or keyboard brightness adjustment working.
- Optionally(!) you can disable / remove unnecessary services. Ruight click and save [debloat.bat](https://raw.githubusercontent.com/seerge/g-helper/main/debloat.bat). Then right click and Run it as Admin. To restore services - save and run [bloat.bat](https://raw.githubusercontent.com/seerge/g-helper/main/bloat.bat) instead.
- You can disable / remove unnecessary services. Ruight click and save [debloat.bat](https://raw.githubusercontent.com/seerge/g-helper/main/debloat.bat). Then right click and Run it as Admin. To restore services - save and run [bloat.bat](https://raw.githubusercontent.com/seerge/g-helper/main/bloat.bat) instead.
- It's not recommended to use an app in combination with Armoury Crate services, because they adjust the same settings. You can [uninstall it using it's own uninstall tool](https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip?model=armoury%20crate). Just in case, you can always install it back later.
@@ -200,7 +198,7 @@ Full list of keycodes https://learn.microsoft.com/en-us/windows/win32/inputdev/v
![Screenshot 2023-04-13 172537](https://user-images.githubusercontent.com/5920850/231837470-df913847-cf8a-43e1-80b6-5eb6e9eaee4e.png)
### Workaround for [bugged bios on G15](https://github.com/seerge/g-helper/issues/253)
### Workaround for [bugged bios on G15](https://github.com/seerge/g-helper/issues/253) when external monitor is connected
Some people reported that on G15 model bios can be bugged and either not turn on or not turn off fans, when you set custom fan curve (in Armoury or g-helper, or any other app)
I have added a very optional workaround as it was asked, on launch app will try to disable and re-enable dGPU when external monitor is connected, that seems to wake up fans :)