Compare commits

...

37 Commits

Author SHA1 Message Date
Serge
7a4d885e1b Fn-lock fix https://github.com/seerge/g-helper/issues/1413 2023-10-04 10:29:03 +02:00
Serge
1c5e46131f Tray icon click fix 2023-10-03 18:35:48 +02:00
Serge
49d5df9bac Toggle one time 100% charge limit https://github.com/seerge/g-helper/issues/1390 2023-10-03 13:37:56 +02:00
Serge
b8870ba3d5 Existence check 2023-10-03 12:25:53 +02:00
Serge
2d7009d8fb Startup re-scheduling https://github.com/seerge/g-helper/issues/1410 2023-10-03 12:22:47 +02:00
Serge
46bfda3ad5 Cleanup 2023-10-03 00:31:07 +02:00
Serge
72b1842520 New translations strings.resx (Chinese Traditional) (#1406) 2023-10-02 23:56:21 +02:00
Serge
2f7b008557 Merge pull request #1407 from nopeless/main
feat: improve focus behavior
2023-10-02 23:49:49 +02:00
nopeless
97361e010e refactor: use AddOwnedForm for group behavior 2023-10-02 14:30:57 -05:00
nopeless
a30920ed70 fix: respect tray icon behavior 2023-10-02 14:09:52 -05:00
nopeless
4509b67ed9 feat: improve focus behavior 2023-10-02 14:00:52 -05:00
Serge
e6fd618900 Update README.md 2023-10-02 14:32:18 +02:00
Serge
9a48e442d5 Refresh rate delay parameter https://github.com/seerge/g-helper/issues/1395 2023-10-02 11:05:45 +02:00
Serge
9e3afe73c6 Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-01 19:47:40 +02:00
Serge
d90da6571e Default screen fix 2023-10-01 19:47:37 +02:00
Serge
19e1014f07 Merge pull request #1397 from seerge/l10n_main
New Crowdin updates
2023-10-01 16:58:09 +02:00
Serge
cd5806ed22 New translations strings.resx (Portuguese, Brazilian) 2023-10-01 13:19:06 +02:00
Serge
0c63e96d0f New translations strings.resx (Vietnamese) 2023-10-01 13:19:05 +02:00
Serge
2271df172c New translations strings.resx (Chinese Traditional) 2023-10-01 13:19:04 +02:00
Serge
5995079e17 New translations strings.resx (Chinese Simplified) 2023-10-01 13:19:03 +02:00
Serge
49e6412c3c New translations strings.resx (Ukrainian) 2023-10-01 13:19:02 +02:00
Serge
3316e88d38 New translations strings.resx (Turkish) 2023-10-01 13:19:02 +02:00
Serge
5501c9c587 New translations strings.resx (Portuguese) 2023-10-01 13:19:01 +02:00
Serge
1d0bb67227 New translations strings.resx (Polish) 2023-10-01 13:19:00 +02:00
Serge
2dd5e93a7c New translations strings.resx (Lithuanian) 2023-10-01 13:18:59 +02:00
Serge
31f19303ec New translations strings.resx (Korean) 2023-10-01 13:18:58 +02:00
Serge
eaa1df636d New translations strings.resx (Italian) 2023-10-01 13:18:57 +02:00
Serge
2c07a1922c New translations strings.resx (Hungarian) 2023-10-01 13:18:56 +02:00
Serge
0d4fc5d94a New translations strings.resx (German) 2023-10-01 13:18:55 +02:00
Serge
b641a87455 New translations strings.resx (Spanish) 2023-10-01 13:18:54 +02:00
Serge
773be3cfd1 New translations strings.resx (French) 2023-10-01 13:18:53 +02:00
Serge
2b7a89b27f New translations strings.resx (Romanian) 2023-10-01 13:18:52 +02:00
Serge
ba1607686f Merge branch 'main' of https://github.com/seerge/g-helper 2023-10-01 13:12:51 +02:00
Serge
6375586ff9 One time 100% battery charge https://github.com/seerge/g-helper/issues/1390 2023-10-01 13:12:49 +02:00
Serge
17da3c7a5c Update README.md 2023-10-01 11:25:10 +02:00
Serge
9f836ff356 Custom hotkey combos https://github.com/seerge/g-helper/issues/1386 2023-10-01 11:22:20 +02:00
Serge
35355f6cb7 Update README.md 2023-10-01 10:36:43 +02:00
30 changed files with 359 additions and 102 deletions

View File

@@ -327,7 +327,7 @@ public static class AppConfig
// Devices with bugged bios command to change brightness
public static bool SwappedBrightness()
{
return ContainsModel("FA506IH") || ContainsModel("FX506LU");
return ContainsModel("FA506IH") || ContainsModel("FX506LU") || ContainsModel("FX506IC");
}

View File

@@ -3,6 +3,21 @@
internal class BatteryControl
{
public static void ToggleBatteryLimitFull()
{
if (AppConfig.Is("charge_full")) SetBatteryChargeLimit();
else SetBatteryLimitFull();
}
public static void SetBatteryLimitFull()
{
AppConfig.Set("charge_full", 1);
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, 100, "BatteryLimit");
Program.settingsForm.VisualiseBatteryFull();
}
public static void SetBatteryChargeLimit(int limit = -1)
{
@@ -10,10 +25,11 @@
if (limit < 40 || limit > 100) return;
Program.acpi.DeviceSet(AsusACPI.BatteryLimit, limit, "BatteryLimit");
Program.settingsForm.VisualiseBattery(limit);
AppConfig.Set("charge_limit", limit);
AppConfig.Set("charge_full", 0);
Program.settingsForm.VisualiseBattery(limit);
}
}

View File

@@ -160,9 +160,11 @@ namespace GHelper.Display
device.monitorFriendlyDeviceName == internalName)
{
if (log) Logger.WriteLine(device.monitorDevicePath + " " + device.outputTechnology);
AppConfig.Set("internal_display", device.monitorFriendlyDeviceName);
var names = device.monitorDevicePath.Split("#");
if (names.Length > 0) return names[1];
if (names.Length > 1) return names[1];
else return "";
}
}

View File

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

View File

@@ -165,7 +165,7 @@ namespace GHelper.Gpu
if (status == 0 && eco == 1 && hardWay) RestartGPU();
await Task.Delay(TimeSpan.FromMilliseconds(100));
await Task.Delay(TimeSpan.FromMilliseconds(AppConfig.Get("refresh_delay", 500)));
settings.Invoke(delegate
{

View File

@@ -10,8 +10,8 @@ public class Startup
public static bool IsScheduled()
{
TaskService taskService = new TaskService();
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
using (TaskService taskService = new TaskService())
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
}
public static void ReScheduleAdmin()
@@ -23,6 +23,26 @@ public class Startup
}
}
public static void StartupCheck()
{
using (TaskService taskService = new TaskService())
{
var task = taskService.RootFolder.AllTasks.FirstOrDefault(t => t.Name == taskName);
if (task != null)
{
string strExeFilePath = Application.ExecutablePath.Trim();
string action = task.Definition.Actions.FirstOrDefault()!.ToString().Trim();
if (!strExeFilePath.Equals(action, StringComparison.OrdinalIgnoreCase) && !File.Exists(action))
{
Logger.WriteLine("File doesn't exist: " + action);
Logger.WriteLine("Rescheduling to: " + strExeFilePath);
UnSchedule();
Schedule();
}
}
}
}
public static void Schedule()
{

View File

@@ -4,6 +4,7 @@ using GHelper.Mode;
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
using System.Text.RegularExpressions;
namespace GHelper.Input
{
@@ -142,25 +143,59 @@ namespace GHelper.Input
}
public static int[] ParseHexValues(string input)
{
string pattern = @"\b(0x[0-9A-Fa-f]{1,2}|[0-9A-Fa-f]{1,2})\b";
if (!Regex.IsMatch(input, $"^{pattern}(\\s+{pattern})*$")) return new int[0];
MatchCollection matches = Regex.Matches(input, pattern);
int[] hexValues = new int[matches.Count];
for (int i = 0; i < matches.Count; i++)
{
string hexValueStr = matches[i].Value;
int hexValue = int.Parse(hexValueStr.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? hexValueStr.Substring(2)
: hexValueStr, System.Globalization.NumberStyles.HexNumber);
hexValues[i] = hexValue;
}
return hexValues;
}
static void CustomKey(string configKey = "m3")
{
string command = AppConfig.GetString(configKey + "_custom");
int intKey;
int[] hexKeys = new int[0];
try
{
intKey = Convert.ToInt32(command, 16);
hexKeys = ParseHexValues(command);
}
catch
{
intKey = -1;
}
if (intKey > 0)
KeyboardHook.KeyPress((Keys)intKey);
else
LaunchProcess(command);
switch (hexKeys.Length)
{
case 1:
KeyboardHook.KeyPress((Keys)hexKeys[0]);
break;
case 2:
KeyboardHook.KeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1]);
break;
case 3:
KeyboardHook.KeyKeyKeyPress((Keys)hexKeys[0], (Keys)hexKeys[1], (Keys)hexKeys[3]);
break;
default:
LaunchProcess(command);
break;
}
}
@@ -264,7 +299,7 @@ namespace GHelper.Input
SetBrightness(+10);
break;
case Keys.F9:
KeyboardHook.KeyWinPress(Keys.P);
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.P);
break;
case Keys.F10:
HandleOptimizationEvent(107);
@@ -273,7 +308,7 @@ namespace GHelper.Input
HandleOptimizationEvent(108);
break;
case Keys.F12:
KeyboardHook.KeyWinPress(Keys.A);
KeyboardHook.KeyKeyPress(Keys.LWin, Keys.A);
break;
case Keys.VolumeDown:
KeyProcess("m1");
@@ -442,7 +477,7 @@ namespace GHelper.Input
static void ToggleTouchpad()
{
KeyboardHook.KeyCtrlWinPress(Keys.F24);
KeyboardHook.KeyKeyKeyPress(Keys.ControlKey, Keys.LWin, Keys.F24);
}
public static void ToggleArrowLock()

View File

@@ -26,23 +26,23 @@ public sealed class KeyboardHook : IDisposable
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
}
public static void KeyWinPress(Keys key)
public static void KeyKeyPress(Keys key, Keys key2)
{
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
public static void KeyCtrlWinPress(Keys key)
public static void KeyKeyKeyPress(Keys key, Keys key2, Keys key3)
{
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
keybd_event((byte)key3, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key2, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
keybd_event(VK_LCONTROL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, IntPtr.Zero);
}
/// <summary>

View File

@@ -119,7 +119,7 @@ namespace GHelper
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\') || action.Length > 0)
{
SettingsToggle(action);
SettingsToggle(action, false);
}
Application.Run();
@@ -156,17 +156,17 @@ namespace GHelper
lastTheme = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
if (settingsForm.fans is not null && settingsForm.fans.Text != "")
settingsForm.fans.InitTheme();
if (settingsForm.fansForm is not null && settingsForm.fansForm.Text != "")
settingsForm.fansForm.InitTheme();
if (settingsForm.keyb is not null && settingsForm.keyb.Text != "")
settingsForm.keyb.InitTheme();
if (settingsForm.extraForm is not null && settingsForm.extraForm.Text != "")
settingsForm.extraForm.InitTheme();
if (settingsForm.updates is not null && settingsForm.updates.Text != "")
settingsForm.updates.InitTheme();
if (settingsForm.updatesForm is not null && settingsForm.updatesForm.Text != "")
settingsForm.updatesForm.InitTheme();
if (settingsForm.matrix is not null && settingsForm.matrix.Text != "")
settingsForm.matrix.InitTheme();
if (settingsForm.matrixForm is not null && settingsForm.matrixForm.Text != "")
settingsForm.matrixForm.InitTheme();
break;
}
}
@@ -213,11 +213,21 @@ namespace GHelper
SetAutoModes(true);
}
public static void SettingsToggle(string action = "")
public static void SettingsToggle(string action = "", bool checkForFocus = true)
{
if (settingsForm.Visible) settingsForm.HideAll();
if (settingsForm.Visible)
{
// If helper window is not on top, this just focuses on the app again
// Pressing the ghelper button again will hide the app
if (checkForFocus && !settingsForm.HasAnyFocus())
{
settingsForm.ShowAll();
}
else
{
settingsForm.HideAll();
}
}
else
{
@@ -246,15 +256,18 @@ namespace GHelper
gpuControl.RestartGPU(false);
break;
case "services":
settingsForm.keyb = new Extra();
settingsForm.keyb.Show();
settingsForm.keyb.ServiesToggle();
settingsForm.extraForm = new Extra();
settingsForm.extraForm.Show();
settingsForm.extraForm.ServiesToggle();
break;
case "uv":
Startup.ReScheduleAdmin();
settingsForm.FansToggle(2);
modeControl.SetRyzen();
break;
default:
Startup.StartupCheck();
break;
}
}
}
@@ -279,5 +292,4 @@ namespace GHelper
}
}

View File

@@ -465,6 +465,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to One time charge to 100%.
/// </summary>
internal static string BatteryLimitFull {
get {
return ResourceManager.GetString("BatteryLimitFull", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to BIOS and Driver Updates.
/// </summary>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Batteriezustand</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS und Treiber Updates</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Salud de la batería</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizaciones de BIOS y Drivers</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Santé de la batterie</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Mise à jour BIOS et pilotes</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Akku állapot</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS és illesztőprogram frissítések</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Salute Batteria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aggiornamenti Driver e BIOS</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>배터리 수명</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>바이오스/드라이버 업데이트</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Sveikata</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ir tvarkyklių naujinimai</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Stan baterii</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Aktualizacje BIOS i sterowników</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS and Driver Updates</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Estado da bateria</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Atualizações de Drivers e da BIOS</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Battery Health</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS and Driver Updates</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Sănătatea bateriei</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Actualizări BIOS și Driver</value>
</data>

View File

@@ -252,11 +252,14 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Pil Sağlığı</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS ve Sürücü Güncellemeleri</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Önyükleme</value>
<value>Boot</value>
</data>
<data name="BootSound" xml:space="preserve">
<value>Boot Sesi</value>
@@ -399,10 +402,10 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Klavye</value>
</data>
<data name="KillGpuApps" xml:space="preserve">
<value>Eco'ya geçerken dGPU kullanan tüm uygulamaları durdur</value>
<value>Eco'ya geçerken harici GPU'yu kullanan tüm uygulamaları durdur</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Aydınlatması</value>
<value>Laptop Aydınlatması</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptop Klavyesi</value>
@@ -498,7 +501,7 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Yeni güncellemeler</value>
</data>
<data name="NoNewUpdates" xml:space="preserve">
<value>Yeni güncelleme yok</value>
<value>Güncelleme yok</value>
</data>
<data name="NotConnected" xml:space="preserve">
<value>Bağlantı Yok</value>
@@ -552,7 +555,7 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Çıkış Yap</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici Gpu'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>
<value>Bir şey harici GPU'yu kullanıyor ve Eco modunu engelliyor. G-Helper aygıt yöneticisinde harici GPU'yu yeniden başlatmayı denesin mi? (Kendi sorumluluğunuzdadır)</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
@@ -642,7 +645,7 @@ Yine de devam etmek istiyor musunuz?</value>
<value>Sesi Azalt</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Ses Kısma</value>
<value>Sesi Kapat</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Sesi Arttır</value>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Стан батареї</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Оновлення BIOS та драйверів</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>Sức khoẻ pin</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>Cập nhật BIOS và driver</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>电池健康</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>One time charge to 100%</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS 和驱动程序更新</value>
</data>

View File

@@ -252,6 +252,9 @@
<data name="BatteryHealth" xml:space="preserve">
<value>電池健康度</value>
</data>
<data name="BatteryLimitFull" xml:space="preserve">
<value>僅本次將電力充滿</value>
</data>
<data name="BiosAndDriverUpdates" xml:space="preserve">
<value>BIOS與驅動程式更新 Updates</value>
</data>

View File

@@ -40,6 +40,7 @@ namespace GHelper
labelMatrix = new Label();
checkMatrix = new CheckBox();
panelBattery = new Panel();
buttonBatteryFull = new RButton();
sliderBattery = new Slider();
panelBatteryTitle = new Panel();
labelBattery = new Label();
@@ -278,6 +279,7 @@ namespace GHelper
//
panelBattery.AutoSize = true;
panelBattery.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelBattery.Controls.Add(buttonBatteryFull);
panelBattery.Controls.Add(sliderBattery);
panelBattery.Controls.Add(panelBatteryTitle);
panelBattery.Dock = DockStyle.Top;
@@ -285,19 +287,39 @@ namespace GHelper
panelBattery.Margin = new Padding(0);
panelBattery.Name = "panelBattery";
panelBattery.Padding = new Padding(20, 20, 20, 10);
panelBattery.Size = new Size(827, 114);
panelBattery.Size = new Size(827, 119);
panelBattery.TabIndex = 5;
//
// buttonBatteryFull
//
buttonBatteryFull.Activated = false;
buttonBatteryFull.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonBatteryFull.BackColor = SystemColors.ControlLight;
buttonBatteryFull.BorderColor = Color.Transparent;
buttonBatteryFull.BorderRadius = 2;
buttonBatteryFull.FlatAppearance.BorderSize = 0;
buttonBatteryFull.FlatStyle = FlatStyle.Flat;
buttonBatteryFull.Font = new Font("Segoe UI", 7.125F, FontStyle.Bold, GraphicsUnit.Point);
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
buttonBatteryFull.Location = new Point(730, 66);
buttonBatteryFull.Margin = new Padding(0);
buttonBatteryFull.Name = "buttonBatteryFull";
buttonBatteryFull.Secondary = true;
buttonBatteryFull.Size = new Size(73, 36);
buttonBatteryFull.TabIndex = 41;
buttonBatteryFull.Text = "100%";
buttonBatteryFull.UseVisualStyleBackColor = false;
//
// sliderBattery
//
sliderBattery.AccessibleName = "Battery Charge Limit";
sliderBattery.Dock = DockStyle.Top;
sliderBattery.Location = new Point(20, 64);
sliderBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
sliderBattery.Location = new Point(20, 65);
sliderBattery.Margin = new Padding(4);
sliderBattery.Max = 100;
sliderBattery.Min = 40;
sliderBattery.Name = "sliderBattery";
sliderBattery.Size = new Size(787, 40);
sliderBattery.Size = new Size(716, 40);
sliderBattery.Step = 5;
sliderBattery.TabIndex = 20;
sliderBattery.Text = "sliderBattery";
@@ -354,7 +376,7 @@ namespace GHelper
panelFooter.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelFooter.Controls.Add(tableButtons);
panelFooter.Dock = DockStyle.Top;
panelFooter.Location = new Point(11, 1435);
panelFooter.Location = new Point(11, 1440);
panelFooter.Margin = new Padding(0);
panelFooter.Name = "panelFooter";
panelFooter.Padding = new Padding(20);
@@ -1232,7 +1254,7 @@ namespace GHelper
panelVersion.Controls.Add(labelCharge);
panelVersion.Controls.Add(checkStartup);
panelVersion.Dock = DockStyle.Top;
panelVersion.Location = new Point(11, 1379);
panelVersion.Location = new Point(11, 1384);
panelVersion.Margin = new Padding(4);
panelVersion.Name = "panelVersion";
panelVersion.Size = new Size(827, 56);
@@ -1550,5 +1572,6 @@ namespace GHelper
private RButton buttonUpdates;
private Label labelCharge;
private RButton buttonFnLock;
private RButton buttonBatteryFull;
}
}

View File

@@ -32,16 +32,19 @@ namespace GHelper
public static System.Timers.Timer sensorTimer = default!;
public Matrix? matrix;
public Fans? fans;
public Extra? keyb;
public Updates? updates;
public Matrix? matrixForm;
public Fans? fansForm;
public Extra? extraForm;
public Updates? updatesForm;
static long lastRefresh;
static long lastBatteryRefresh;
static long lastLostFocus;
bool isGpuSection = true;
bool batteryMouseOver = false;
bool batteryFullMouseOver = false;
public SettingsForm()
{
@@ -86,6 +89,7 @@ namespace GHelper
buttonUpdates.Text = Properties.Strings.Updates;
FormClosing += SettingsForm_FormClosing;
Deactivate += SettingsForm_LostFocus;
buttonSilent.BorderColor = colorEco;
buttonBalanced.BorderColor = colorStandard;
@@ -193,6 +197,10 @@ namespace GHelper
buttonPeripheral2.MouseEnter += ButtonPeripheral_MouseEnter;
buttonPeripheral3.MouseEnter += ButtonPeripheral_MouseEnter;
buttonBatteryFull.MouseEnter += ButtonBatteryFull_MouseEnter;
buttonBatteryFull.MouseLeave += ButtonBatteryFull_MouseLeave;
buttonBatteryFull.Click += ButtonBatteryFull_Click;
Text = "G-Helper " + (ProcessHelper.IsUserAdministrator() ? "—" : "-") + " " + AppConfig.GetModelShort();
TopMost = AppConfig.Is("topmost");
@@ -206,6 +214,27 @@ namespace GHelper
panelPerformance.Focus();
}
private void SettingsForm_LostFocus(object? sender, EventArgs e)
{
lastLostFocus = DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
private void ButtonBatteryFull_Click(object? sender, EventArgs e)
{
BatteryControl.ToggleBatteryLimitFull();
}
private void ButtonBatteryFull_MouseLeave(object? sender, EventArgs e)
{
batteryFullMouseOver = false;
RefreshSensors(true);
}
private void ButtonBatteryFull_MouseEnter(object? sender, EventArgs e)
{
batteryFullMouseOver = true;
labelCharge.Text = Properties.Strings.BatteryLimitFull;
}
private void SettingsForm_Resize(object? sender, EventArgs e)
{
@@ -260,21 +289,26 @@ namespace GHelper
private void ButtonUpdates_Click(object? sender, EventArgs e)
{
if (updates == null || updates.Text == "")
if (updatesForm == null || updatesForm.Text == "")
{
updates = new Updates();
updates.Show();
updatesForm = new Updates();
AddOwnedForm(updatesForm);
}
if (updatesForm.Visible)
{
updatesForm.Close();
}
else
{
updates.Close();
updatesForm.Show();
}
}
public void VisualiseMatrix(string image)
{
if (matrix == null || matrix.Text == "") return;
matrix.VisualiseMatrix(image);
if (matrixForm == null || matrixForm.Text == "") return;
matrixForm.VisualiseMatrix(image);
}
protected override void WndProc(ref Message m)
@@ -522,19 +556,20 @@ namespace GHelper
private void ButtonMatrix_Click(object? sender, EventArgs e)
{
if (matrix == null || matrix.Text == "")
if (matrixForm == null || matrixForm.Text == "")
{
matrix = new Matrix();
matrixForm = new Matrix();
AddOwnedForm(matrixForm);
}
if (matrix.Visible)
if (matrixForm.Visible)
{
matrix.Close();
matrixForm.Close();
}
else
{
matrix.FormPosition();
matrix.Show();
matrixForm.FormPosition();
matrixForm.Show();
}
}
@@ -589,14 +624,19 @@ namespace GHelper
private void ButtonKeyboard_Click(object? sender, EventArgs e)
{
if (keyb == null || keyb.Text == "")
if (extraForm == null || extraForm.Text == "")
{
keyb = new Extra();
keyb.Show();
extraForm = new Extra();
AddOwnedForm(extraForm);
}
if (extraForm.Visible)
{
extraForm.Close();
}
else
{
keyb.Close();
extraForm.Show();
}
}
@@ -604,7 +644,7 @@ namespace GHelper
{
Invoke(delegate
{
if (fans != null && fans.Text != "") fans.InitAll();
if (fansForm != null && fansForm.Text != "") fansForm.InitAll();
});
}
@@ -612,26 +652,27 @@ namespace GHelper
{
Invoke(delegate
{
if (fans != null && fans.Text != "") fans.InitGPU();
if (fansForm != null && fansForm.Text != "") fansForm.InitGPU();
});
}
public void FansToggle(int index = 0)
{
if (fans == null || fans.Text == "")
if (fansForm == null || fansForm.Text == "")
{
fans = new Fans();
fansForm = new Fans();
AddOwnedForm(fansForm);
}
if (fans.Visible)
if (fansForm.Visible)
{
fans.Close();
fansForm.Close();
}
else
{
fans.FormPosition();
fans.Show();
fans.ToggleNavigation(index);
fansForm.FormPosition();
fansForm.Show();
fansForm.ToggleNavigation(index);
}
}
@@ -817,14 +858,39 @@ namespace GHelper
Application.Exit();
}
/// <summary>
/// Closes all forms except the settings. Hides the settings
/// </summary>
public void HideAll()
{
this.Hide();
if (fans != null && fans.Text != "") fans.Close();
if (keyb != null && keyb.Text != "") keyb.Close();
if (updates != null && updates.Text != "") updates.Close();
if (fansForm != null && fansForm.Text != "") fansForm.Close();
if (extraForm != null && extraForm.Text != "") extraForm.Close();
if (updatesForm != null && updatesForm.Text != "") updatesForm.Close();
if (matrixForm != null && matrixForm.Text != "") matrixForm.Close();
}
/// <summary>
/// Brings all visible windows to the top, with settings being the focus
/// </summary>
public void ShowAll()
{
this.Activate();
}
/// <summary>
/// Check if any of fans, keyboard, update, or itself has focus
/// </summary>
/// <returns>Focus state</returns>
public bool HasAnyFocus()
{
return (fansForm != null && fansForm.ContainsFocus) ||
(extraForm != null && extraForm.ContainsFocus) ||
(updatesForm != null && updatesForm.ContainsFocus) ||
(matrixForm != null && matrixForm.ContainsFocus) ||
this.ContainsFocus ||
Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastLostFocus) < 300;
}
private void SettingsForm_FormClosing(object? sender, FormClosingEventArgs e)
{
@@ -906,7 +972,7 @@ namespace GHelper
labelMidFan.Text = "Mid " + HardwareControl.midFan;
labelBattery.Text = battery;
if (!batteryMouseOver) labelCharge.Text = charge;
if (!batteryMouseOver && !batteryFullMouseOver) labelCharge.Text = charge;
//panelPerformance.AccessibleName = labelPerf.Text + " " + trayTip;
});
@@ -918,8 +984,8 @@ namespace GHelper
public void LabelFansResult(string text)
{
if (fans != null && fans.Text != "")
fans.LabelFansResult(text);
if (fansForm != null && fansForm.Text != "")
fansForm.LabelFansResult(text);
}
public void ShowMode(int mode)
@@ -1035,7 +1101,8 @@ namespace GHelper
buttonStopGPU.Visible = true;
tableGPU.ColumnCount = 3;
tableScreen.ColumnCount = 3;
} else
}
else
{
buttonStopGPU.Visible = false;
}
@@ -1164,6 +1231,22 @@ namespace GHelper
{
labelBatteryTitle.Text = Properties.Strings.BatteryChargeLimit + ": " + limit.ToString() + "%";
sliderBattery.Value = limit;
VisualiseBatteryFull();
}
public void VisualiseBatteryFull()
{
if (AppConfig.Is("charge_full"))
{
buttonBatteryFull.BackColor = colorStandard;
buttonBatteryFull.ForeColor = SystemColors.ControlLightLight;
}
else
{
buttonBatteryFull.BackColor = buttonSecond;
buttonBatteryFull.ForeColor = SystemColors.ControlDark;
}
}

View File

@@ -99,7 +99,7 @@ You don't have to, it's purely optional. From my experience built in (in BIOS) p
Click on them
#### When I try to apply a custom fan curve I get "BIOS rejected fan curve"
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in Armoury as well?
TUF models from 2021 and older don't support custom fan curves at all. Most probably you didn't have them in the Armoury as well?
#### I don't see a GPU temperature in G-helper
Most probably either you are using Eco / Optimized mode and your dGPU is simply off, or your windows has put the dGPU into sleep to preserve power.
@@ -110,7 +110,7 @@ Please check the system tray for a ``(G)`` icon. By default Windows is keen to h
#### App crashes or doesn't work properly
Open "Event Viewer" from the start menu, go to Windows Logs -> Application and check for recent Errors mentioning G-Helper. If you see one - please post a [new issue](https://github.com/seerge/g-helper/issues) with all details from this error.
#### Can I use MyASUS app along with G-Helper?
#### Can I use the 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?
@@ -123,7 +123,7 @@ Personally, I'm not a big fan of them, as they make colors very inaccurate. But
Make sure that your dGPU is enabled (i.e. it's not in Eco mode). Open Fans + Power section and adjust core / memory clock offsets. They work the same as in armoury's manual mode. Please keep in mind that (unfortunately) you need admin permissions for that, and the app will ask you for them. (*)
#### How to Undervolt GPU
Due to the way of how Core Clock offset works for GPU. When you increase clock offset you undervolt it at the same time (see picture)
Due to the way the Core Clock offset works for the GPU. When you increase clock offset you undervolt it at the same time (see picture)
1. Increase ``Core Clock Offset`` under ``Fans + Power -> GPU`` until your 3dmark / furmark / game runs stable. Start with +100, +150, +200 ... This should make your **scores / fps better within same power** / heat as before.
2. Set ``Core Clock Limit`` to a certain value (it really depends on application / game that you use) **to lower your power** / heat consumption
@@ -250,7 +250,7 @@ Example (for default windows "balanced" power plan):
```
### Alternative Activation for XG Mobile 6850XT
If you experience situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs "alternative" command to get activated.
If you experience a situation when your XG Mobile doesn't work on full power when Activated. It's possible it needs an "alternative" command to get activated.
To turn it on, add following line to config :
```
"xgm_special" : 1,
@@ -258,7 +258,7 @@ To turn it on, add following line to config :
### Override UI theme
By default app would set UI theme from "app" theme in windows setting. You can override it to specific theme, or general windows theme
By default the app would set the UI theme from the "app" theme in Windows setting. You can override it to specific theme, or general windows theme
```
"ui_mode" : "dark",
@@ -267,7 +267,7 @@ By default app would set UI theme from "app" theme in windows setting. You can o
```
### Skip keyboard Aura initialisation on startup
By default app would set last remembered RGB mode for keyboard on each launch. To disable it completely
By default the app would set the last remembered RGB mode for the keyboard on each launch. To disable it completely
```
"skip_aura" : 1,
@@ -280,7 +280,7 @@ Disable app's OSD (for performance modes, keyboard backlight, etc.)
```
### Disable "Tablet mode" on X13/X16
To disable automatic touchpad toggling when laptop enteres / leaves tablet mode
To disable automatic touchpad toggling when laptop enters / leaves tablet mode
```
"disable_tablet": 1,
```
@@ -296,20 +296,24 @@ If you don't want this bindings to work you can add
"skip_hotkeys":1,
```
### Toggle Performance Mode key binding
### Toggle Performance Mode or Toggle App Window key binding
To change binding for Toggle Performance Modes to ``Ctrl + Shift + KEY``
```
"keybind_profile": 116,
```
To change binding for Toggle App Window to ``Ctrl + Shift + KEY``
```
"keybind_app": 123,
```
Where 116 is [numerical code for desired key](https://www.oreilly.com/library/view/javascript-dhtml/9780596514082/apb.html). Put 0 to completely disable this binding.
### Higher Maximum GPU Clock / Memory Offsets
By default under GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
By default under the GPU section you can set up to +250/+250 for Core and Memory Clock Offset. To increase this value:
```
"max_gpu_core": 300,
"max_gpu_memory": 1500,
@@ -322,7 +326,9 @@ Select ``Custom`` next to appropriate hotkey under ``Extra`` settings and do one
1. To run any custom application - put a full path to exe into "action" text field, for example:
``C:\Program Files\EA Games\Battlefield 2042\BF2042.exe``
2. To simulate any windows key - put appropriate keycode into the "action" field, for example ``0x2C`` for Print Screen.
2. To simulate any windows key or key-combination - put appropriate keycode(s) into the "action" field separated by space.
For example ``0x2C`` for ``Print Screen`` or ``0x11 0xA0 0x31`` for ``Ctrl+Shift+1``
Full list of keycodes https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
![Screenshot 2023-07-17 192155](https://github.com/seerge/g-helper/assets/5920850/e450e124-1589-4787-bce8-7c37ffe72fbd)