Compare commits

...

112 Commits
v0.59 ... v0.68

Author SHA1 Message Date
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
Serge
80e3971dad m1,m2 bindings 2023-05-21 20:44:04 +02:00
Serge
ac60986646 Sleep Fix 2023-05-21 19:19:26 +02:00
Serge
1e0169a71d Added M1/M2 keys and keyboard init 2023-05-21 19:01:43 +02:00
Serge
e0346a8af8 UI Tweaks 2023-05-21 18:06:41 +02:00
Serge
4ee97fdbc4 XGM Fixes 2023-05-21 17:42:15 +02:00
Serge
34075b67d4 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-21 12:27:54 +02:00
Serge
4ed9675d99 Refactoring 2023-05-21 12:27:52 +02:00
Serge
af3538e105 Update README.md 2023-05-21 00:24:57 +02:00
Serge
d818405e04 Bumped version to 0.65 2023-05-20 23:14:15 +02:00
Serge
9794229f3f Extra icons for OSD 2023-05-20 22:59:17 +02:00
Serge
9f56959c67 Some OSD notifications 2023-05-20 21:51:02 +02:00
Serge
09e6676b7c Merge pull request #418 from marcelomijas/main
Update Spanish translation
2023-05-20 20:51:57 +02:00
Serge
6adb2e2fcf Keyboard Reading 2023-05-20 20:50:58 +02:00
Marcelo Moreno
08cc4409a9 Update Spanish translation 2023-05-20 20:37:54 +02:00
Serge
1ac0f2be08 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-20 14:28:08 +02:00
Serge
05e66d3b95 Tweaks 2023-05-20 14:28:05 +02:00
Serge
0f8f1e9ce5 Merge pull request #300 from tbateson/main
Add GitHub workflows
2023-05-20 11:51:42 +02:00
Thomas Bateson
d37b46c588 Add GitHub workflows 2023-05-19 13:32:31 -05:00
Serge
020a7d074f Some renamings 2023-05-19 19:14:07 +02:00
Serge
7eb7cc9f78 UI tweaks 2023-05-19 16:09:27 +02:00
Serge
38d60e88ea Fixed anime matrix crash 2023-05-19 13:46:49 +02:00
Serge
0cc16765b6 Update README.md 2023-05-19 11:27:24 +02:00
Serge
96f705806b Update README.md 2023-05-19 11:17:27 +02:00
Serge
d1cceda2ab UI Tweaks 2023-05-19 10:40:16 +02:00
Serge
381b4dd3e8 Merge pull request #409 from TomBonnot/main
Adding French and Português Version
2023-05-19 00:16:11 +02:00
Tom Bonnot
a99dcbf445 Last changes on portuguese-brazilian version + deleting .idea files 2023-05-18 18:12:44 -04:00
Tom Bonnot
4751383a3a Saving progress on pt-br translation 2023-05-18 15:50:32 -04:00
Serge
06320afcb3 Audio visualizer 2023-05-18 18:21:09 +02:00
Serge
0eb6209eda Matrix audio visualizer 2023-05-18 17:42:19 +02:00
Tom Bonnot
a342cab9a6 Final version for French translation 2023-05-18 11:40:02 -04:00
Tom Bonnot
12c6482f61 Adding pt-br and completion of fr version (might need some corrections) 2023-05-18 10:30:05 -04:00
Tom Bonnot
20933bfd8d First commit - French version 2023-05-18 09:51:30 -04:00
Serge
c66c8e9030 Custom keybinding for mode toggle 2023-05-17 20:33:41 +02:00
Serge
14b677514b Update README.md 2023-05-17 17:17:13 +02:00
Serge
ce266ffe07 Merge pull request #402 from IceStormNG/german-translation
German translation
2023-05-17 16:51:04 +02:00
Serge
f29410fa2a Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-17 14:52:09 +02:00
Serge
7117b58746 ACPI events listener 2023-05-17 14:52:06 +02:00
Carsten Braun
0456fa013c Improbed a few translations and fixed typos. 2023-05-17 13:11:11 +02:00
Carsten Braun
6a4aa4e138 Localize fan speed labels in the main window 2023-05-17 10:47:41 +02:00
IceStormNG
d75067b40c Merge branch 'seerge:main' into german-translation 2023-05-17 10:39:02 +02:00
Carsten Braun
de45038911 Translated the App to German. Added a few additional resources for localization 2023-05-16 16:20:00 +02:00
Serge
e23c727e79 Update README.md 2023-05-16 15:44:30 +02:00
Serge
2f2c534278 Merge pull request #394 from lswlc33/main
Update Strings.zh-CN.resx
2023-05-16 15:21:34 +02:00
Serge
bdbec79aba UI tweaks 2023-05-16 15:19:53 +02:00
雪中明月
e3d0a04fa4 Update Strings.zh-CN.resx 2023-05-16 21:12:58 +08:00
Serge
4dd7d41cf4 Merge pull request #392 from IceStormNG/windows-power-plan-changes-optional
Windows power plan changes optional
2023-05-16 14:53:58 +02:00
Carsten Braun
8370217cef This is not a perf config but a regular config value. 2023-05-16 13:34:40 +02:00
Carsten Braun
63c1829edd We can reference the checkbox directly 2023-05-16 13:34:26 +02:00
Carsten Braun
69e5a0448e Accomodate for non-exitent settings value 2023-05-16 13:30:08 +02:00
Carsten Braun
b74b9ae257 Fix nullability 2023-05-16 13:29:48 +02:00
Carsten Braun
71e007d8ad Fixed UI that VS Forms Designer broke 2023-05-16 13:29:31 +02:00
Carsten Braun
6896166c3c Fixed French translation value 2023-05-16 12:36:26 +02:00
Carsten Braun
fd89d9c13a Changed string to "Power Mode" instead of "power plan" 2023-05-16 12:33:15 +02:00
Carsten Braun
8bec153da8 Fixed localization key for french 2023-05-16 12:30:57 +02:00
Carsten Braun
7d968f5f08 Do not set default value. 2023-05-16 12:24:06 +02:00
Carsten Braun
ac5fc3f96e Revert "Revert "Adjustment of Windows Power Overlay is now optional""
This reverts commit 8804d19567.
2023-05-16 12:21:28 +02:00
Serge
8590d0301a Merge pull request #391 from seerge/revert-385-windows-power-plan-changes-optional
Revert "Adjustment of Windows Power Overlay is now optional"
2023-05-16 11:39:41 +02:00
Serge
8804d19567 Revert "Adjustment of Windows Power Overlay is now optional" 2023-05-16 11:38:17 +02:00
Serge
57ce0631a3 Merge pull request #385 from IceStormNG/windows-power-plan-changes-optional
Adjustment of Windows Power Overlay is now optional
2023-05-16 11:30:41 +02:00
Carsten Braun
b796f9f9d4 Moved checkbox to 2023-05-16 10:41:02 +02:00
Serge
f39563fcdf Added touchpad toggle for tablet mode on x13/x16 2023-05-15 23:59:21 +02:00
Serge
853d0c231d Auto update 2023-05-15 22:23:16 +02:00
Serge
df3324d641 Auto update 2023-05-15 22:21:41 +02:00
Serge
75c90ee155 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-15 22:11:29 +02:00
Serge
4015e0a7f7 Added auto-update checker 2023-05-15 22:11:27 +02:00
Carsten Braun
2a82e41894 Adjustment of Windows Power Overlay is now optional 2023-05-15 13:23:20 +02:00
Serge
a5541dfe10 Update README.md 2023-05-14 19:52:02 +02:00
Serge
fd3a139c47 Aura tweaks 2023-05-14 10:28:48 +02:00
Serge
608b8571d4 Fix for turkish keyboard, tweak for default fan curves 2023-05-13 22:13:00 +02:00
Serge
82a39bcfa1 Merge pull request #375 from IceStormNG/animematrix-for-GU604
Supports AniMeMatrix for Zephyrus M16 2023 (GU604)
2023-05-13 18:24:37 +02:00
Carsten Braun
f9ccd92dc6 Supports AniMeMatrix for Zephyrus M16 2023 (GU604) 2023-05-13 18:10:18 +02:00
Serge
1fadc6c31e Hotfix for possible crash 2023-05-13 09:43:26 +02:00
Serge
0b7dd42a5d UI tweak 2023-05-12 17:21:04 +02:00
Serge
51cd700e25 Improved GPU restart 2023-05-12 15:51:57 +02:00
Serge
7484253007 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-12 14:06:19 +02:00
Serge
f5cf768017 Display workaround 2023-05-12 14:06:15 +02:00
Serge
ca57669596 NV Clocks tweaks 2023-05-11 19:38:53 +02:00
Serge
35f1a3a25b Clock tweak 2023-05-11 11:18:42 +02:00
Serge
b7afe94b8d Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-11 10:52:41 +02:00
Serge
97c97e8e19 Eco tweaks 2023-05-11 10:52:40 +02:00
Serge
ffc5a6f641 Update README.md 2023-05-11 00:40:30 +02:00
Serge
f87e6c5c88 Update README.md 2023-05-11 00:39:07 +02:00
Serge
22f136fe9e Crash fix 2023-05-11 00:35:03 +02:00
Serge
6d85376734 Extra logs 2023-05-10 23:24:54 +02:00
Serge
62512a7c05 Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-10 18:38:51 +02:00
Serge
7a6301328c GPU Restart 2023-05-10 18:38:49 +02:00
Serge
3c6c4d122d Update README.md 2023-05-10 15:31:20 +02:00
Serge
0142c25929 Overclocking logic, added restart-gpu workaround 2023-05-10 14:06:33 +02:00
Serge
27bc7339d8 Merge pull request #351 from marcelomijas/main
Update Spanish translation
2023-05-09 22:11:44 +02:00
Marcelo Moreno
2985fe378c Small fix... 2023-05-09 22:09:36 +02:00
Marcelo Moreno
71daba25a8 Update Spanish translation
Update the Spanish translation file so it has the same fields as the original "Strings.resx", and translated the new items. :)
2023-05-09 22:01:09 +02:00
Serge
16feeb05a1 Clocks fixes 2023-05-09 18:21:07 +02:00
Serge
c69bf65c84 Clocks fixes 2023-05-09 18:02:59 +02:00
Serge
56ea434626 Aura fix 2023-05-09 17:16:10 +02:00
Serge
432508cfc5 GPU settings tweaks 2023-05-09 16:51:15 +02:00
Serge
deb515066d Merge branch 'main' of https://github.com/seerge/g-helper 2023-05-09 16:13:40 +02:00
Serge
ac19a822f7 GPU eco check 2023-05-09 16:13:35 +02:00
Serge
41caaefc97 Improved aura logging 2023-05-09 16:05:57 +02:00
53 changed files with 4260 additions and 1753 deletions

25
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
name: Build
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
workflow_dispatch:
permissions:
contents: read
jobs:
build:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- name: Setup dotnet
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
7.0.x
- name: Build
run: |
dotnet build app/GHelper.sln

28
.github/workflows/codeql.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: CodeQL
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
schedule:
- cron: '34 18 * * 3'
permissions:
actions: read
contents: read
security-events: write
jobs:
codeql:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: c#
- name: Autobuild
uses: github/codeql-action/autobuild@v2
- name: Analyze
uses: github/codeql-action/analyze@v2

28
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: Release
on:
release:
types: [ published ]
permissions:
contents: write
jobs:
release:
runs-on: windows-2022
steps:
- uses: actions/checkout@v3
- name: Setup dotnet
uses: actions/setup-dotnet@v3
with:
dotnet-version: |
7.0.x
- name: Publish
run: |
dotnet publish app/GHelper.sln --configuration Release --runtime win-x64 -p:PublishSingleFile=true --no-self-contained
powershell Compress-Archive app/bin/x64/Release/net7.0-windows8.0/win-x64/publish/GHelper.exe GHelper.zip
- name: Upload
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release upload ${{ github.ref_name }} app/bin/x64/Release/net7.0-windows8.0/win-x64/publish/GHelper.exe GHelper.zip

View File

@@ -0,0 +1,312 @@
using NAudio.CoreAudioApi;
using NAudio.Wave;
using Starlight.AnimeMatrix;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Timers;
namespace GHelper.AnimeMatrix
{
public class AniMatrix
{
System.Timers.Timer matrixTimer = default!;
AnimeMatrixDevice mat;
double[] AudioValues;
WasapiCapture AudioDevice;
public bool IsValid => mat != null;
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;
}
catch
{
mat = null;
}
}
public void SetMatrix()
{
if (!IsValid) return;
int brightness = AppConfig.getConfig("matrix_brightness");
int running = AppConfig.getConfig("matrix_running");
bool auto = AppConfig.getConfig("matrix_auto") == 1;
if (brightness < 0) brightness = 0;
if (running < 0) running = 0;
BuiltInAnimation animation = new BuiltInAnimation(
(BuiltInAnimation.Running)running,
BuiltInAnimation.Sleeping.Starfield,
BuiltInAnimation.Shutdown.SeeYa,
BuiltInAnimation.Startup.StaticEmergence
);
StopMatrixTimer();
StopMatrixAudio();
mat.SetProvider();
if (brightness == 0 || (auto && SystemInformation.PowerStatus.PowerLineStatus != PowerLineStatus.Online))
{
mat.SetDisplayState(false);
Logger.WriteLine("Matrix Off");
}
else
{
mat.SetDisplayState(true);
mat.SetBrightness((BrightnessMode)brightness);
switch (running)
{
case 2:
SetMatrixPicture(AppConfig.getConfigString("matrix_picture"));
break;
case 3:
SetMatrixClock();
break;
case 4:
SetMatrixAudio();
break;
default:
mat.SetBuiltInAnimation(true, animation);
Logger.WriteLine("Matrix builtin " + animation.AsByte);
break;
}
//mat.SetBrightness((BrightnessMode)brightness);
}
}
private void StartMatrixTimer(int interval = 100)
{
matrixTimer.Interval = interval;
matrixTimer.Start();
}
private void StopMatrixTimer()
{
matrixTimer.Stop();
}
private void MatrixTimer_Elapsed(object? sender, ElapsedEventArgs e)
{
//if (!IsValid) return;
switch (AppConfig.getConfig("matrix_running"))
{
case 2:
mat.PresentNextFrame();
break;
case 3:
mat.PresentClock();
break;
}
}
public void SetMatrixClock()
{
mat.SetBuiltInAnimation(false);
StartMatrixTimer(1000);
Logger.WriteLine("Matrix Clock");
}
public void Dispose()
{
StopMatrixAudio();
}
void StopMatrixAudio()
{
if (AudioDevice is not null)
{
try
{
AudioDevice.StopRecording();
AudioDevice.Dispose();
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
}
}
void SetMatrixAudio()
{
if (!IsValid) return;
mat.SetBuiltInAnimation(false);
StopMatrixTimer();
StopMatrixAudio();
try
{
using (var enumerator = new MMDeviceEnumerator())
using (MMDevice device = enumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Console))
{
AudioDevice = new WasapiLoopbackCapture(device);
WaveFormat fmt = AudioDevice.WaveFormat;
AudioValues = new double[fmt.SampleRate / 1000];
AudioDevice.DataAvailable += WaveIn_DataAvailable;
AudioDevice.StartRecording();
Logger.WriteLine("Matrix Audio");
}
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
}
}
private void WaveIn_DataAvailable(object? sender, WaveInEventArgs e)
{
int bytesPerSamplePerChannel = AudioDevice.WaveFormat.BitsPerSample / 8;
int bytesPerSample = bytesPerSamplePerChannel * AudioDevice.WaveFormat.Channels;
int bufferSampleCount = e.Buffer.Length / bytesPerSample;
if (bufferSampleCount >= AudioValues.Length)
{
bufferSampleCount = AudioValues.Length;
}
if (bytesPerSamplePerChannel == 2 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
{
for (int i = 0; i < bufferSampleCount; i++)
AudioValues[i] = BitConverter.ToInt16(e.Buffer, i * bytesPerSample);
}
else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.Pcm)
{
for (int i = 0; i < bufferSampleCount; i++)
AudioValues[i] = BitConverter.ToInt32(e.Buffer, i * bytesPerSample);
}
else if (bytesPerSamplePerChannel == 4 && AudioDevice.WaveFormat.Encoding == WaveFormatEncoding.IeeeFloat)
{
for (int i = 0; i < bufferSampleCount; i++)
AudioValues[i] = BitConverter.ToSingle(e.Buffer, i * bytesPerSample);
}
double[] paddedAudio = FftSharp.Pad.ZeroPad(AudioValues);
double[] fftMag = FftSharp.Transform.FFTmagnitude(paddedAudio);
PresentAudio(fftMag);
}
private void DrawBar(int pos, double h)
{
int dx = pos * 2;
int dy = 20;
byte color;
for (int y = 0; y < h - (h % 2); y++)
for (int x = 0; x < 2 - (y % 2); x++)
{
//color = (byte)(Math.Min(1,(h - y - 2)*2) * 255);
mat.SetLedPlanar(x + dx, dy + y, (byte)(h * 255 / 30));
mat.SetLedPlanar(x + dx, dy - y, 255);
}
}
void PresentAudio(double[] audio)
{
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastPresent) < 70) return;
lastPresent = DateTimeOffset.Now.ToUnixTimeMilliseconds();
mat.Clear();
int size = 20;
double[] bars = new double[size];
double max = 2, maxAverage;
for (int i = 0; i < size; i++)
{
bars[i] = Math.Sqrt(audio[i] * 10000);
if (bars[i] > max) max = bars[i];
}
maxes.Add(max);
if (maxes.Count > 20) maxes.RemoveAt(0);
maxAverage = maxes.Average();
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i]*20/maxAverage);
mat.Present();
}
public void SetMatrixPicture(string fileName)
{
if (!IsValid) return;
StopMatrixTimer();
Image image;
try
{
using (var fs = new FileStream(fileName, FileMode.Open))
{
var ms = new MemoryStream();
fs.CopyTo(ms);
ms.Position = 0;
image = Image.FromStream(ms);
}
}
catch
{
Debug.WriteLine("Error loading picture");
return;
}
mat.SetBuiltInAnimation(false);
mat.ClearFrames();
FrameDimension dimension = new FrameDimension(image.FrameDimensionsList[0]);
int frameCount = image.GetFrameCount(dimension);
if (frameCount > 1)
{
for (int i = 0; i < frameCount; i++)
{
image.SelectActiveFrame(dimension, i);
mat.GenerateFrame(image);
mat.AddFrame();
}
StartMatrixTimer();
Logger.WriteLine("Matrix GIF " + fileName);
}
else
{
mat.GenerateFrame(image);
mat.Present();
Logger.WriteLine("Matrix " + fileName);
}
}
}
}

View File

@@ -2,6 +2,7 @@
using Starlight.Communication;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Globalization;
using System.Management;
using System.Text;
@@ -61,7 +62,8 @@ namespace Starlight.AnimeMatrix
public enum AnimeType
{
GA401,
GA402
GA402,
GU604
}
@@ -88,12 +90,15 @@ namespace Starlight.AnimeMatrix
//public int FullEvenRows = -1;
public int dx = 0;
//Shifts the whole frame to the left or right to align with the diagonal cut
public int frameShiftX = 0;
public int MaxColumns = 34;
private int frameIndex = 0;
private static AnimeType _model = AnimeType.GA402;
public AnimeMatrixDevice()
: base(0x0B05, 0x193B, 640)
{
@@ -112,6 +117,16 @@ namespace Starlight.AnimeMatrix
UpdatePageLength = 410;
}
if (model.Contains("GU604"))
{
_model = AnimeType.GU604;
MaxColumns = 39;
MaxRows = 92;
LedCount = 1711;
frameShiftX = -5;
UpdatePageLength = 630;
}
_displayBuffer = new byte[LedCount];
@@ -173,6 +188,9 @@ namespace Starlight.AnimeMatrix
{
return (y + 1) / 2 - 3;
}
case AnimeType.GU604:
return (int)Math.Ceiling(Math.Max(0, y - 9) / 2F);
default:
return (int)Math.Ceiling(Math.Max(0, y - 11) / 2F);
}
@@ -184,6 +202,8 @@ namespace Starlight.AnimeMatrix
{
case AnimeType.GA401:
return 33;
case AnimeType.GU604:
return 39;
default:
return 34;
}
@@ -226,7 +246,7 @@ namespace Starlight.AnimeMatrix
if (!IsRowInRange(y)) return;
if (x >= FirstX(y) && x < Width(y))
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx, value);
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx + frameShiftX, value);
}
public void WakeUp()
@@ -325,13 +345,21 @@ namespace Starlight.AnimeMatrix
public void PresentClock()
{
int second = DateTime.Now.Second;
string time;
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
PresentTextDiagonal(DateTime.Now.ToString("H" + ((second % 2 == 0) ? ":" : " ") + "mm"));
time = DateTime.Now.ToString("H" + ((second % 2 == 0) ? ":" : " ") + "mm");
else
PresentTextDiagonal(DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mmtt"));
time = DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mmtt");
if (_model == AnimeType.GA401)
PresentText(time);
else
PresentTextDiagonal(time);
}
public void PresentText(string text1, string text2 = "")
{
using (Bitmap bmp = new Bitmap(MaxColumns * 3, MaxRows))
@@ -341,14 +369,14 @@ namespace Starlight.AnimeMatrix
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (Font font = new Font("Arial", 24F, GraphicsUnit.Pixel))
using (Font font = new Font("Consolas", 24F, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text1, font);
g.DrawString(text1, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 3, -3);
g.DrawString(text1, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 3, -4);
}
if (text2.Length > 0)
using (Font font = new Font("Arial", 18F, GraphicsUnit.Pixel))
using (Font font = new Font("Consolas", 18F, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text2, font);
g.DrawString(text2, font, Brushes.White, (MaxColumns * 3 - textSize.Width) + 1, 25);
@@ -419,6 +447,24 @@ namespace Starlight.AnimeMatrix
Clear();
InstalledFontCollection installedFontCollection = new InstalledFontCollection();
string familyName;
string familyList = "";
FontFamily[] fontFamilies;
// Get the array of FontFamily objects.
fontFamilies = installedFontCollection.Families;
int count = fontFamilies.Length;
for (int j = 0; j < count; ++j)
{
familyName = fontFamilies[j].Name;
familyList = familyList + familyName;
familyList = familyList + ", ";
}
int maxX = (int)Math.Sqrt(MaxRows * MaxRows + MaxColumns * MaxColumns);
using (Bitmap bmp = new Bitmap(maxX, MaxRows))
@@ -428,10 +474,10 @@ namespace Starlight.AnimeMatrix
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
using (Font font = new Font("Calibri", 13F, GraphicsUnit.Pixel))
using (Font font = new Font("Consolas", 13F, FontStyle.Regular, GraphicsUnit.Pixel))
{
SizeF textSize = g.MeasureString(text, font);
g.DrawString(text, font, Brushes.White, 4, 0);
g.DrawString(text, font, Brushes.White, 4, 1);
}
}

View File

@@ -2,20 +2,18 @@
using System.Management;
using System.Text.Json;
public class AppConfig
public static class AppConfig
{
public string appPath;
string configFile;
private static string configFile;
private static string? _model;
string _model;
private static Dictionary<string, object> config = new Dictionary<string, object>();
public Dictionary<string, object> config = new Dictionary<string, object>();
public AppConfig()
static AppConfig()
{
appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
configFile = appPath + "\\config.json";
if (!System.IO.Directory.Exists(appPath))
@@ -41,7 +39,7 @@ public class AppConfig
}
public string GetModel()
public static string GetModel()
{
if (_model is null)
{
@@ -58,14 +56,14 @@ public class AppConfig
return _model;
}
public bool ContainsModel(string contains)
public static bool ContainsModel(string contains)
{
GetModel();
return (_model is not null && _model.Contains(contains));
}
private void initConfig()
private static void initConfig()
{
config = new Dictionary<string, object>();
config["performance_mode"] = 0;
@@ -73,22 +71,26 @@ public class AppConfig
File.WriteAllText(configFile, jsonString);
}
public int getConfig(string name, bool performance = false)
public static int getConfig(string name)
{
if (config.ContainsKey(name))
return int.Parse(config[name].ToString());
else return -1;
}
public string getConfigString(string name)
public static bool isConfig(string name)
{
return getConfig(name) == 1;
}
public static string getConfigString(string name)
{
if (config.ContainsKey(name))
return config[name].ToString();
else return null;
}
public void setConfig(string name, int value)
public static void setConfig(string name, int value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
@@ -101,7 +103,7 @@ public class AppConfig
}
}
public void setConfig(string name, string value)
public static void setConfig(string name, string value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
@@ -115,22 +117,32 @@ public class AppConfig
}
}
public string getParamName(int device, string paramName = "fan_profile")
public static string getParamName(AsusFan device, string paramName = "fan_profile")
{
int mode = getConfig("performance_mode");
string name;
if (device == 1)
name = "gpu";
else if (device == 2)
name = "mid";
else
name = "cpu";
switch (device)
{
case AsusFan.GPU:
name = "gpu";
break;
case AsusFan.Mid:
name = "mid";
break;
case AsusFan.XGM:
name = "xgm";
break;
default:
name = "cpu";
break;
}
return paramName + "_" + name + "_" + mode;
}
public byte[] getFanConfig(int device)
public static byte[] getFanConfig(AsusFan device)
{
string curveString = getConfigString(getParamName(device));
byte[] curve = { };
@@ -141,7 +153,7 @@ public class AppConfig
return curve;
}
public void setFanConfig(int device, byte[] curve)
public static void setFanConfig(AsusFan device, byte[] curve)
{
string bitCurve = BitConverter.ToString(curve);
setConfig(getParamName(device), bitCurve);
@@ -156,7 +168,7 @@ public class AppConfig
return array;
}
public byte[] getDefaultCurve(int device)
public static byte[] getDefaultCurve(AsusFan device)
{
int mode = getConfig("performance_mode");
byte[] curve;
@@ -164,19 +176,19 @@ public class AppConfig
switch (mode)
{
case 1:
if (device == 1)
if (device == AsusFan.GPU)
curve = StringToBytes("14-3F-44-48-4C-50-54-62-16-1F-26-2D-39-47-55-5F");
else
curve = StringToBytes("14-3F-44-48-4C-50-54-62-11-1A-22-29-34-43-51-5A");
break;
case 2:
if (device == 1)
if (device == AsusFan.GPU)
curve = StringToBytes("3C-41-42-46-47-4B-4C-62-08-11-11-1D-1D-26-26-2D");
else
curve = StringToBytes("3C-41-42-46-47-4B-4C-62-03-0C-0C-16-16-22-22-29");
break;
default:
if (device == 1)
if (device == AsusFan.GPU)
curve = StringToBytes("3A-3D-40-44-48-4D-51-62-0C-16-1D-1F-26-2D-34-4A");
else
curve = StringToBytes("3A-3D-40-44-48-4D-51-62-08-11-16-1A-22-29-30-45");
@@ -186,19 +198,19 @@ public class AppConfig
return curve;
}
public string getConfigPerfString(string name)
public static string getConfigPerfString(string name)
{
int mode = getConfig("performance_mode");
return getConfigString(name + "_" + mode);
}
public int getConfigPerf(string name)
public static int getConfigPerf(string name)
{
int mode = getConfig("performance_mode");
return getConfig(name + "_" + mode);
}
public void setConfigPerf(string name, int value)
public static void setConfigPerf(string name, int value)
{
int mode = getConfig("performance_mode");
setConfig(name + "_" + mode, value);

View File

@@ -1,7 +1,30 @@
using System.Management;
using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
public class ASUSWmi
public enum AsusFan
{
CPU = 0,
GPU = 1,
Mid = 2,
XGM = 3
}
public enum AsusMode
{
Balanced = 0,
Turbo = 1,
Silent = 2
}
public enum AsusGPU
{
Eco = 0,
Standard = 1,
Ultimate = 2
}
public class AsusACPI
{
const string FILE_NAME = @"\\.\\ATKACPI";
@@ -13,6 +36,7 @@ public class ASUSWmi
public const uint UniversalControl = 0x00100021;
public const int KB_Light_Up = 0xc4;
public const int KB_Light_Down = 0xc5;
public const int Touchpad_Toggle = 0x6B;
public const int ChargerMode = 0x0012006C;
@@ -57,6 +81,13 @@ public class ASUSWmi
public const int TUF_KB = 0x00100056;
public const int TUF_KB_STATE = 0x00100057;
public const int TabletState = 0x00060077;
public const int Tablet_Notebook = 0;
public const int Tablet_Tablet = 1;
public const int Tablet_Tent = 2;
public const int Tablet_Rotated = 3;
public const int PerformanceBalanced = 0;
public const int PerformanceTurbo = 1;
public const int PerformanceSilent = 2;
@@ -116,7 +147,43 @@ public class ASUSWmi
private IntPtr handle;
public ASUSWmi()
// Event handling attempt
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);
private IntPtr eventHandle;
// still works only with asus optimization service on , if someone knows how to get ACPI events from asus without that - let me know
public void RunListener()
{
eventHandle = CreateEvent(IntPtr.Zero, false, false, "ATK Event");
byte[] outBuffer = new byte[16];
byte[] data = new byte[8];
bool result;
data[0] = BitConverter.GetBytes(eventHandle.ToInt32())[0];
data[1] = BitConverter.GetBytes(eventHandle.ToInt32())[1];
result = Control(0x222400, data, outBuffer);
Logger.WriteLine("ACPI " + result + ":" + BitConverter.ToString(data) + "|" + BitConverter.ToString(outBuffer));
while (true)
{
WaitForSingleObject(eventHandle, Timeout.Infinite);
Control(0x222408, new byte[0], outBuffer);
int code = BitConverter.ToInt32(outBuffer);
Logger.WriteLine("Code: " + code);
}
}
public AsusACPI()
{
handle = CreateFile(
FILE_NAME,
@@ -127,16 +194,18 @@ public class ASUSWmi
FILE_ATTRIBUTE_NORMAL,
IntPtr.Zero
);
if (handle == new IntPtr(-1))
{
throw new Exception("Can't connect to ACPI");
}
}
public void Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
public bool Control(uint dwIoControlCode, byte[] lpInBuffer, byte[] lpOutBuffer)
{
uint lpBytesReturned = 0;
bool result = DeviceIoControl(
return DeviceIoControl(
handle,
dwIoControlCode,
lpInBuffer,
@@ -204,7 +273,7 @@ public class ASUSWmi
byte[] args = new byte[8];
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
byte[] status = CallMethod(DSTS, args);
return BitConverter.ToInt32(status, 0) - 65536;
}
@@ -214,12 +283,26 @@ public class ASUSWmi
byte[] args = new byte[8];
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
BitConverter.GetBytes((uint)Status).CopyTo(args, 4);
return CallMethod(DSTS, args);
}
public int SetGPUEco(int eco)
{
int ecoFlag = DeviceGet(GPUEco);
if (ecoFlag < 0) return -1;
public int SetFanCurve(int device, byte[] curve)
if (ecoFlag == 1 && eco == 0)
return DeviceSet(GPUEco, eco, "GPUEco");
if (ecoFlag == 0 && eco == 1)
return DeviceSet(GPUEco, eco, "GPUEco");
return -1;
}
public int SetFanCurve(AsusFan device, byte[] curve)
{
if (curve.Length != 16) return -1;
@@ -228,16 +311,14 @@ public class ASUSWmi
int result;
for (int i = 8; i < curve.Length; i++)
{
curve[i] = Math.Max((byte)0, Math.Min((byte)99, curve[i])); // it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
}
switch (device)
{
case 1:
case AsusFan.GPU:
result = DeviceSet(DevsGPUFanCurve, curve, "FanGPU");
break;
case 2:
case AsusFan.Mid:
result = DeviceSet(DevsMidFanCurve, curve, "FanMid");
break;
default:
@@ -248,7 +329,7 @@ public class ASUSWmi
return result;
}
public byte[] GetFanCurve(int device, int mode = 0)
public byte[] GetFanCurve(AsusFan device, int mode = 0)
{
uint fan_mode;
@@ -262,9 +343,9 @@ public class ASUSWmi
switch (device)
{
case 1:
case AsusFan.GPU:
return DeviceGetBuffer(DevsGPUFanCurve, fan_mode);
case 2:
case AsusFan.Mid:
return DeviceGetBuffer(DevsMidFanCurve, fan_mode);
default:
return DeviceGetBuffer(DevsCPUFanCurve, fan_mode);
@@ -272,6 +353,58 @@ public class ASUSWmi
}
public static bool IsInvalidCurve(byte[] curve)
{
return curve.Length != 16 || IsEmptyCurve(curve);
}
public static bool IsEmptyCurve(byte[] curve)
{
return curve.All(singleByte => singleByte == 0);
}
public static byte[] FixFanCurve(byte[] curve)
{
if (curve.Length != 16) throw new Exception("Incorrect curve");
var points = new Dictionary<byte, byte>();
for (int i = 0; i < 8; i++) points[curve[i]] = curve[i + 8];
var pointsFixed = new Dictionary<byte, byte>();
bool fix = false;
int count = 0;
foreach (var pair in points.OrderBy(x => x.Key))
{
if (count == 0 && pair.Key >= 40)
{
fix = true;
pointsFixed.Add(20, 0);
}
if (count != 3 || !fix)
pointsFixed.Add(pair.Key, pair.Value);
count++;
}
count = 0;
foreach (var pair in pointsFixed.OrderBy(x => x.Key))
{
curve[count] = pair.Key;
curve[count + 8] = pair.Value;
count++;
}
return curve;
}
public bool IsXGConnected()
{
//return true;
return DeviceGet(GPUXGConnected) == 1;
}
public void TUFKeyboardBrightness(int brightness)
{
int param = 0x80 | (brightness & 0x7F);
@@ -321,7 +454,8 @@ public class ASUSWmi
watcher.Scope = new ManagementScope("root\\wmi");
watcher.Query = new WqlEventQuery("SELECT * FROM AsusAtkWmiEvent");
watcher.Start();
} catch
}
catch
{
Logger.WriteLine("Can't connect to ASUS WMI events");
}

404
app/AsusUSB.cs Normal file
View File

@@ -0,0 +1,404 @@
using HidLibrary;
using Microsoft.Win32;
using System.Text;
namespace GHelper
{
[Flags]
public enum AuraDev19b6 : uint
{
BootLogo = 1,
BootKeyb = 1 << 1,
AwakeLogo = 1 << 2,
AwakeKeyb = 1 << 3,
SleepLogo = 1 << 4,
SleepKeyb = 1 << 5,
ShutdownLogo = 1 << 6,
ShutdownKeyb = 1 << 7,
BootBar = 1u << (7 + 2),
AwakeBar = 1u << (7 + 3),
SleepBar = 1u << (7 + 4),
ShutdownBar = 1u << (7 + 5),
BootLid = 1u << (15 + 1),
AwakeLid = 1u << (15 + 2),
SleepLid = 1u << (15 + 3),
ShutdownLid = 1u << (15 + 4)
}
public static class AuraDev19b6Extensions
{
public static byte[] ToBytes(this AuraDev19b6[] controls)
{
uint a = 0;
foreach (var n in controls)
{
a |= (uint)n;
}
return new byte[] { 0x5d, 0xbd, 0x01, (byte)(a & 0xff), (byte)((a & 0xff00) >> 8), (byte)((a & 0xff0000) >> 16) };
}
public static ushort BitOr(this AuraDev19b6 self, AuraDev19b6 rhs)
{
return (ushort)(self | rhs);
}
public static ushort BitAnd(this AuraDev19b6 self, AuraDev19b6 rhs)
{
return (ushort)(self & rhs);
}
}
public static class AsusUSB
{
public const int ASUS_ID = 0x0b05;
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[] { 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 = { 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 };
private static int mode = 0;
private static int speed = 1;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
public static Dictionary<int, string> GetSpeeds()
{
return new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraSlow },
{ 1, Properties.Strings.AuraNormal },
{ 2, Properties.Strings.AuraFast }
};
}
static Dictionary<int, string> _modes = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 10, Properties.Strings.AuraStrobe },
};
static Dictionary<int, string> _modesStrix = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 4, "Star" },
{ 5, "Rain" },
{ 6, "Highlight" },
{ 7, "Laser" },
{ 8, "Ripple" },
{ 10, Properties.Strings.AuraStrobe},
{ 11, "Comet" },
{ 12, "Flash" },
};
public static Dictionary<int, string> GetModes()
{
if (AppConfig.ContainsModel("TUF"))
{
_modes.Remove(3);
}
if (AppConfig.ContainsModel("401"))
{
_modes.Remove(2);
_modes.Remove(3);
}
if (AppConfig.ContainsModel("Strix") || AppConfig.ContainsModel("Scar"))
{
return _modesStrix;
}
return _modes;
}
public static int Mode
{
get { return mode; }
set
{
if (GetModes().ContainsKey(value))
mode = value;
else
mode = 0;
}
}
public static bool HasSecondColor()
{
return (mode == 1 && !AppConfig.ContainsModel("TUF"));
}
public static int Speed
{
get { return speed; }
set
{
if (GetSpeeds().ContainsKey(value))
speed = value;
else
speed = 1;
}
}
public static void SetColor(int colorCode)
{
Color1 = Color.FromArgb(colorCode);
}
public static void SetColor2(int colorCode)
{
Color2 = Color.FromArgb(colorCode);
}
private static IEnumerable<HidDevice> GetHidDevices(int[] deviceIds, int minInput = 18)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
foreach (HidDevice device in HidDeviceList)
if (device.IsConnected
&& device.Capabilities.FeatureReportByteLength > 0
&& device.Capabilities.InputReportByteLength >= minInput)
yield return device;
}
public static HidDevice? GetDevice(byte reportID = INPUT_HID_ID)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(ASUS_ID, deviceIds).ToArray();
HidDevice input = null;
foreach (HidDevice device in HidDeviceList)
if (device.ReadFeatureData(out byte[] data, reportID))
{
input = device;
//Logger.WriteLine("HID Device("+ reportID + ")" + + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.DevicePath);
}
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] = AURA_HID_ID;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
msg[4] = (byte)(color.R); // R
msg[5] = (byte)(color.G); // G
msg[6] = (byte)(color.B); // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[10] = (byte)(color2.R); // R
msg[11] = (byte)(color2.G); // G
msg[12] = (byte)(color2.B); // B
return msg;
}
public static void Init()
{
Task.Run(() =>
{
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.CloseDevice();
}
});
}
public static void ApplyBrightness(int brightness)
{
Task.Run(() =>
{
byte[] msg = { INPUT_HID_ID, 0xba, 0xc5, 0xc4, (byte)brightness };
Logger.WriteLine("KB Backlight:" + BitConverter.ToString(msg));
var devices = GetHidDevices(deviceIds, 0);
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(msg);
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardBrightness(brightness);
});
}
public static void ApplyAuraPower(List<AuraDev19b6> flags)
{
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
var devices = GetHidDevices(deviceIds);
//Logger.WriteLine("USB-KB = " + BitConverter.ToString(msg));
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(msg);
Logger.WriteLine("USB-KB " + device.Attributes.ProductHexId + ":" + BitConverter.ToString(msg));
device.CloseDevice();
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardPower(
flags.Contains(AuraDev19b6.AwakeKeyb),
flags.Contains(AuraDev19b6.BootKeyb),
flags.Contains(AuraDev19b6.SleepKeyb),
flags.Contains(AuraDev19b6.ShutdownKeyb));
}
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()
{
int _speed;
switch (Speed)
{
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
}
byte[] msg = AuraMessage(Mode, Color1, Color2, _speed);
var devices = GetHidDevices(deviceIds);
if (devices.Count() == 0)
{
Logger.WriteLine("USB-KB : not found");
devices = GetHidDevices(deviceIds, 1);
}
foreach (HidDevice device in devices)
{
device.OpenDevice();
device.WriteFeatureData(msg);
device.WriteFeatureData(MESSAGE_SET);
device.WriteFeatureData(MESSAGE_APPLY);
device.CloseDevice();
Logger.WriteLine("USB-KB " + device.Capabilities.FeatureReportByteLength + "|" + device.Capabilities.InputReportByteLength + device.Description + device.DevicePath + ":" + BitConverter.ToString(msg));
}
if (AppConfig.ContainsModel("TUF"))
Program.acpi.TUFKeyboardRGB(Mode, Color1, _speed);
}
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,291 +0,0 @@
using HidLibrary;
using OSD;
using System.Diagnostics;
namespace GHelper
{
[Flags]
public enum AuraDev19b6 : uint
{
BootLogo = 1,
BootKeyb = 1 << 1,
AwakeLogo = 1 << 2,
AwakeKeyb = 1 << 3,
SleepLogo = 1 << 4,
SleepKeyb = 1 << 5,
ShutdownLogo = 1 << 6,
ShutdownKeyb = 1 << 7,
Unknown1 = 1 << 8,
BootBar = 1u << (7 + 2),
AwakeBar = 1u << (7 + 3),
SleepBar = 1u << (7 + 4),
ShutdownBar = 1u << (7 + 5),
Unknown2 = 1 << 13,
Unknown3 = 1 << 14,
Unknown4 = 1 << 15,
BootLid = 1u << (15 + 1),
AwakeLid = 1u << (15 + 2),
SleepLid = 1u << (15 + 3),
ShutdownLid = 1u << (15 + 4)
}
public static class AuraDev19b6Extensions
{
public static byte[] ToBytes(this AuraDev19b6[] controls)
{
uint a = 0;
foreach (var n in controls)
{
a |= (uint)n;
}
return new byte[] { 0x5d, 0xbd, 0x01, (byte)(a & 0xff), (byte)((a & 0xff00) >> 8), (byte)((a & 0xff0000) >> 16) };
}
public static ushort BitOr(this AuraDev19b6 self, AuraDev19b6 rhs)
{
return (ushort)(self | rhs);
}
public static ushort BitAnd(this AuraDev19b6 self, AuraDev19b6 rhs)
{
return (ushort)(self & rhs);
}
}
public static class Aura
{
static byte[] MESSAGE_SET = { 0x5d, 0xb5, 0, 0, 0 };
static byte[] MESSAGE_APPLY = { 0x5d, 0xb4 };
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0 };
private static int mode = 0;
private static int speed = 1;
public static Color Color1 = Color.White;
public static Color Color2 = Color.Black;
public static Dictionary<int, string> GetSpeeds()
{
return new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraSlow },
{ 1, Properties.Strings.AuraNormal },
{ 2, Properties.Strings.AuraFast }
};
}
static Dictionary<int, string> _modes = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 10, Properties.Strings.AuraStrobe },
};
static Dictionary<int, string> _modesStrix = new Dictionary<int, string>
{
{ 0, Properties.Strings.AuraStatic },
{ 1, Properties.Strings.AuraBreathe },
{ 2, Properties.Strings.AuraColorCycle },
{ 3, Properties.Strings.AuraRainbow },
{ 4, "Star" },
{ 5, "Rain" },
{ 6, "Highlight" },
{ 7, "Laser" },
{ 8, "Ripple" },
{ 10, Properties.Strings.AuraStrobe},
{ 11, "Comet" },
{ 12, "Flash" },
};
public static Dictionary<int, string> GetModes()
{
if (Program.config.ContainsModel("TUF"))
{
_modes.Remove(3);
}
if (Program.config.ContainsModel("401"))
{
_modes.Remove(2);
_modes.Remove(3);
}
if (Program.config.ContainsModel("Strix") || Program.config.ContainsModel("Scar"))
{
return _modesStrix;
}
return _modes;
}
public static int Mode
{
get { return mode; }
set
{
if (GetModes().ContainsKey(value))
mode = value;
else
mode = 0;
}
}
public static bool HasSecondColor()
{
return (mode == 1 && !Program.config.ContainsModel("TUF"));
}
public static int Speed
{
get { return speed; }
set
{
if (GetSpeeds().ContainsKey(value))
speed = value;
else
speed = 1;
}
}
public static void SetColor(int colorCode)
{
Color1 = Color.FromArgb(colorCode);
}
public static void SetColor2(int colorCode)
{
Color2 = Color.FromArgb(colorCode);
}
private static IEnumerable<HidDevice> GetHidDevices(int[] deviceIds)
{
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
foreach (HidDevice device in HidDeviceList)
if (device.IsConnected && device.Description.ToLower().Contains("hid") && device.Capabilities.FeatureReportByteLength >= 64)
yield return device;
}
public static byte[] AuraMessage(int mode, Color color, Color color2, int speed)
{
byte[] msg = new byte[17];
msg[0] = 0x5d;
msg[1] = 0xb3;
msg[2] = 0x00; // Zone
msg[3] = (byte)mode; // Aura Mode
msg[4] = (byte)(color.R); // R
msg[5] = (byte)(color.G); // G
msg[6] = (byte)(color.B); // B
msg[7] = (byte)speed; // aura.speed as u8;
msg[8] = 0; // aura.direction as u8;
msg[10] = (byte)(color2.R); // R
msg[11] = (byte)(color2.G); // G
msg[12] = (byte)(color2.B); // B
return msg;
}
public static void ApplyBrightness(int brightness)
{
byte[] msg = { 0x5d, 0xba, 0xc5, 0xc4, (byte)brightness };
foreach (HidDevice device in GetHidDevices(new int[] { 0x19b6 }))
{
device.OpenDevice();
device.Write(msg);
device.CloseDevice();
}
Logger.WriteLine("USB-KB = " + BitConverter.ToString(msg));
if (Program.config.ContainsModel("TUF"))
Program.wmi.TUFKeyboardBrightness(brightness);
}
public static void ApplyAuraPower(List<AuraDev19b6> flags)
{
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
Debug.WriteLine(BitConverter.ToString(msg));
foreach (HidDevice device in GetHidDevices(new int[] { 0x19b6 }))
{
device.OpenDevice();
device.Write(msg);
device.CloseDevice();
}
Logger.WriteLine("USB-KB = " + BitConverter.ToString(msg));
//if (Program.config.ContainsModel("TUF"))
Program.wmi.TUFKeyboardPower(
flags.Contains(AuraDev19b6.AwakeKeyb),
flags.Contains(AuraDev19b6.BootKeyb),
flags.Contains(AuraDev19b6.SleepKeyb),
flags.Contains(AuraDev19b6.ShutdownKeyb));
}
public static void ApplyXGMLight(bool status)
{
byte value = status? (byte)0x50:(byte)0;
var msg = new byte[] { 0x5e, 0xc5, value };
foreach (HidDevice device in GetHidDevices(new int[] { 0x1970 }))
{
device.OpenDevice();
var message = new byte[300];
Array.Copy(msg, message, msg.Length);
Debug.WriteLine(BitConverter.ToString(message));
device.WriteFeatureData(message);
device.CloseDevice();
}
}
public static void ApplyAura()
{
int _speed;
switch (Speed)
{
case 1:
_speed = 0xeb;
break;
case 2:
_speed = 0xf5;
break;
default:
_speed = 0xe1;
break;
}
byte[] msg = AuraMessage(Mode, Color1, Color2, _speed);
foreach (HidDevice device in GetHidDevices(deviceIds))
{
device.OpenDevice();
device.Write(msg);
device.Write(MESSAGE_SET);
device.Write(MESSAGE_APPLY);
device.CloseDevice();
}
if (Program.config.ContainsModel("TUF"))
Program.wmi.TUFKeyboardRGB(Mode, Color1, _speed);
}
}
}

View File

@@ -92,7 +92,7 @@ public static class ControlHelper
}
var chk = control as CheckBox;
if (chk != null && chk.Padding.Left > 5)
if (chk != null && chk.Padding.Right > 5)
{
chk.BackColor = RForm.buttonSecond;
}

View File

@@ -30,11 +30,6 @@ namespace CustomControls
public bool darkTheme = false;
public RForm()
{
DoubleBuffered = true;
}
public static void InitColors(bool darkTheme)
{
if (darkTheme)

454
app/Extra.Designer.cs generated
View File

@@ -32,18 +32,27 @@ namespace GHelper
private void InitializeComponent()
{
groupBindings = new GroupBox();
pictureHelp = new PictureBox();
textFNF4 = new TextBox();
comboFNF4 = new RComboBox();
tableKeys = new TableLayoutPanel();
textM2 = new TextBox();
textM1 = new TextBox();
comboM1 = new RComboBox();
labelM1 = new Label();
labelFNF4 = new Label();
comboFNF4 = new RComboBox();
comboM4 = new RComboBox();
comboM3 = new RComboBox();
textFNF4 = new TextBox();
textM4 = new TextBox();
textM3 = new TextBox();
comboM4 = new RComboBox();
labelM4 = new Label();
comboM3 = new RComboBox();
labelM3 = new Label();
labelM2 = new Label();
comboM2 = new RComboBox();
pictureHelp = new PictureBox();
groupLight = new GroupBox();
panelBacklightExtra = new Panel();
numericBacklightTime = new NumericUpDown();
labelBacklightTimeout = new Label();
labelBrightness = new Label();
trackBrightness = new TrackBar();
labelSpeed = new Label();
@@ -72,14 +81,17 @@ namespace GHelper
checkSleepLid = new CheckBox();
checkShutdownLid = new CheckBox();
groupOther = new GroupBox();
checkAutoApplyWindowsPowerMode = new CheckBox();
checkKeyboardAuto = new CheckBox();
checkUSBC = new CheckBox();
checkNoOverdrive = new CheckBox();
checkKeyboardAuto = new CheckBox();
checkTopmost = new CheckBox();
groupBindings.SuspendLayout();
tableKeys.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureHelp).BeginInit();
groupLight.SuspendLayout();
panelBacklightExtra.SuspendLayout();
((System.ComponentModel.ISupportInitialize)numericBacklightTime).BeginInit();
((System.ComponentModel.ISupportInitialize)trackBrightness).BeginInit();
panelXMG.SuspendLayout();
tableBacklight.SuspendLayout();
@@ -88,118 +100,199 @@ namespace GHelper
//
// groupBindings
//
groupBindings.Controls.Add(tableKeys);
groupBindings.Controls.Add(pictureHelp);
groupBindings.Controls.Add(textFNF4);
groupBindings.Controls.Add(comboFNF4);
groupBindings.Controls.Add(labelFNF4);
groupBindings.Controls.Add(textM4);
groupBindings.Controls.Add(textM3);
groupBindings.Controls.Add(comboM4);
groupBindings.Controls.Add(labelM4);
groupBindings.Controls.Add(comboM3);
groupBindings.Controls.Add(labelM3);
groupBindings.Dock = DockStyle.Top;
groupBindings.Location = new Point(10, 10);
groupBindings.Name = "groupBindings";
groupBindings.Size = new Size(848, 242);
groupBindings.Size = new Size(954, 324);
groupBindings.TabIndex = 0;
groupBindings.TabStop = false;
groupBindings.Text = "Key Bindings";
//
// pictureHelp
// tableKeys
//
pictureHelp.BackgroundImage = Resources.icons8_help_64;
pictureHelp.BackgroundImageLayout = ImageLayout.Zoom;
pictureHelp.Cursor = Cursors.Hand;
pictureHelp.Location = new Point(744, 57);
pictureHelp.Name = "pictureHelp";
pictureHelp.Size = new Size(32, 32);
pictureHelp.TabIndex = 9;
pictureHelp.TabStop = false;
tableKeys.ColumnCount = 3;
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 20F));
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableKeys.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
tableKeys.Controls.Add(textM2, 2, 1);
tableKeys.Controls.Add(textM1, 2, 0);
tableKeys.Controls.Add(comboM1, 1, 0);
tableKeys.Controls.Add(labelM1, 0, 0);
tableKeys.Controls.Add(labelFNF4, 0, 4);
tableKeys.Controls.Add(comboFNF4, 1, 4);
tableKeys.Controls.Add(comboM4, 1, 3);
tableKeys.Controls.Add(comboM3, 1, 2);
tableKeys.Controls.Add(textFNF4, 2, 4);
tableKeys.Controls.Add(textM4, 2, 3);
tableKeys.Controls.Add(textM3, 2, 2);
tableKeys.Controls.Add(labelM4, 0, 3);
tableKeys.Controls.Add(labelM3, 0, 2);
tableKeys.Controls.Add(labelM2, 0, 1);
tableKeys.Controls.Add(comboM2, 1, 1);
tableKeys.Location = new Point(13, 38);
tableKeys.Name = "tableKeys";
tableKeys.Padding = new Padding(10);
tableKeys.RowCount = 5;
tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
tableKeys.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
tableKeys.Size = new Size(897, 266);
tableKeys.TabIndex = 10;
//
// textFNF4
// textM2
//
textFNF4.Location = new Point(415, 176);
textFNF4.Name = "textFNF4";
textFNF4.PlaceholderText = "action";
textFNF4.Size = new Size(320, 39);
textFNF4.TabIndex = 8;
textM2.Location = new Point(538, 63);
textM2.Name = "textM2";
textM2.PlaceholderText = "action";
textM2.Size = new Size(346, 39);
textM2.TabIndex = 14;
//
// textM1
//
textM1.Location = new Point(538, 13);
textM1.Name = "textM1";
textM1.PlaceholderText = "action";
textM1.Size = new Size(346, 39);
textM1.TabIndex = 13;
//
// comboM1
//
comboM1.BorderColor = Color.White;
comboM1.ButtonColor = Color.FromArgb(255, 255, 255);
comboM1.FormattingEnabled = true;
comboM1.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM1.Location = new Point(188, 13);
comboM1.Name = "comboM1";
comboM1.Size = new Size(312, 40);
comboM1.TabIndex = 11;
//
// labelM1
//
labelM1.AutoSize = true;
labelM1.Location = new Point(13, 10);
labelM1.Name = "labelM1";
labelM1.Size = new Size(54, 32);
labelM1.TabIndex = 9;
labelM1.Text = "M1:";
//
// labelFNF4
//
labelFNF4.AutoSize = true;
labelFNF4.Location = new Point(13, 210);
labelFNF4.Name = "labelFNF4";
labelFNF4.Size = new Size(90, 32);
labelFNF4.TabIndex = 6;
labelFNF4.Text = "FN+F4:";
//
// comboFNF4
//
comboFNF4.BorderColor = Color.White;
comboFNF4.ButtonColor = Color.FromArgb(255, 255, 255);
comboFNF4.FormattingEnabled = true;
comboFNF4.Location = new Point(93, 175);
comboFNF4.Location = new Point(188, 213);
comboFNF4.Name = "comboFNF4";
comboFNF4.Size = new Size(312, 40);
comboFNF4.TabIndex = 7;
//
// labelFNF4
//
labelFNF4.AutoSize = true;
labelFNF4.Location = new Point(2, 178);
labelFNF4.Name = "labelFNF4";
labelFNF4.Size = new Size(90, 32);
labelFNF4.TabIndex = 6;
labelFNF4.Text = "FN+F4:";
//
// textM4
//
textM4.Location = new Point(415, 113);
textM4.Name = "textM4";
textM4.PlaceholderText = "action";
textM4.Size = new Size(320, 39);
textM4.TabIndex = 5;
//
// textM3
//
textM3.Location = new Point(415, 54);
textM3.Name = "textM3";
textM3.PlaceholderText = "notepad /p \"file.txt\"";
textM3.Size = new Size(320, 39);
textM3.TabIndex = 4;
//
// comboM4
//
comboM4.BorderColor = Color.White;
comboM4.ButtonColor = Color.FromArgb(255, 255, 255);
comboM4.FormattingEnabled = true;
comboM4.Items.AddRange(new object[] { Strings.PerformanceMode, Strings.OpenGHelper, Strings.Custom });
comboM4.Location = new Point(93, 112);
comboM4.Location = new Point(188, 163);
comboM4.Name = "comboM4";
comboM4.Size = new Size(312, 40);
comboM4.TabIndex = 3;
//
// labelM4
//
labelM4.AutoSize = true;
labelM4.Location = new Point(25, 116);
labelM4.Name = "labelM4";
labelM4.Size = new Size(54, 32);
labelM4.TabIndex = 2;
labelM4.Text = "M4:";
//
// comboM3
//
comboM3.BorderColor = Color.White;
comboM3.ButtonColor = Color.FromArgb(255, 255, 255);
comboM3.FormattingEnabled = true;
comboM3.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM3.Location = new Point(93, 54);
comboM3.Location = new Point(188, 113);
comboM3.Name = "comboM3";
comboM3.Size = new Size(312, 40);
comboM3.TabIndex = 1;
//
// textFNF4
//
textFNF4.Location = new Point(538, 213);
textFNF4.Name = "textFNF4";
textFNF4.PlaceholderText = "action";
textFNF4.Size = new Size(346, 39);
textFNF4.TabIndex = 8;
//
// textM4
//
textM4.Location = new Point(538, 163);
textM4.Name = "textM4";
textM4.PlaceholderText = "action";
textM4.Size = new Size(346, 39);
textM4.TabIndex = 5;
//
// textM3
//
textM3.Location = new Point(538, 113);
textM3.Name = "textM3";
textM3.PlaceholderText = "action";
textM3.Size = new Size(346, 39);
textM3.TabIndex = 4;
//
// labelM4
//
labelM4.AutoSize = true;
labelM4.Location = new Point(13, 160);
labelM4.Name = "labelM4";
labelM4.Size = new Size(54, 32);
labelM4.TabIndex = 2;
labelM4.Text = "M4:";
//
// labelM3
//
labelM3.AutoSize = true;
labelM3.Location = new Point(25, 58);
labelM3.Location = new Point(13, 110);
labelM3.Name = "labelM3";
labelM3.Size = new Size(54, 32);
labelM3.TabIndex = 0;
labelM3.Text = "M3:";
//
// labelM2
//
labelM2.AutoSize = true;
labelM2.Location = new Point(13, 60);
labelM2.Name = "labelM2";
labelM2.Size = new Size(54, 32);
labelM2.TabIndex = 10;
labelM2.Text = "M2:";
//
// comboM2
//
comboM2.BorderColor = Color.White;
comboM2.ButtonColor = Color.FromArgb(255, 255, 255);
comboM2.FormattingEnabled = true;
comboM2.Items.AddRange(new object[] { Strings.Default, Strings.VolumeMute, Strings.PlayPause, Strings.PrintScreen, Strings.ToggleAura, Strings.Custom });
comboM2.Location = new Point(188, 63);
comboM2.Name = "comboM2";
comboM2.Size = new Size(312, 40);
comboM2.TabIndex = 12;
//
// pictureHelp
//
pictureHelp.BackgroundImage = Resources.icons8_help_64;
pictureHelp.BackgroundImageLayout = ImageLayout.Zoom;
pictureHelp.Cursor = Cursors.Hand;
pictureHelp.Location = new Point(906, 51);
pictureHelp.Name = "pictureHelp";
pictureHelp.Size = new Size(32, 32);
pictureHelp.TabIndex = 9;
pictureHelp.TabStop = false;
//
// groupLight
//
groupLight.AutoSize = true;
@@ -207,16 +300,17 @@ namespace GHelper
groupLight.Controls.Add(panelXMG);
groupLight.Controls.Add(tableBacklight);
groupLight.Dock = DockStyle.Top;
groupLight.Location = new Point(10, 252);
groupLight.Location = new Point(10, 334);
groupLight.Name = "groupLight";
groupLight.Size = new Size(848, 475);
groupLight.Size = new Size(954, 516);
groupLight.TabIndex = 1;
groupLight.TabStop = false;
groupLight.Text = "Keyboard Backlight";
//
// panelBacklightExtra
//
panelBacklightExtra.AutoSize = true;
panelBacklightExtra.Controls.Add(numericBacklightTime);
panelBacklightExtra.Controls.Add(labelBacklightTimeout);
panelBacklightExtra.Controls.Add(labelBrightness);
panelBacklightExtra.Controls.Add(trackBrightness);
panelBacklightExtra.Controls.Add(labelSpeed);
@@ -224,33 +318,48 @@ namespace GHelper
panelBacklightExtra.Dock = DockStyle.Top;
panelBacklightExtra.Location = new Point(3, 319);
panelBacklightExtra.Name = "panelBacklightExtra";
panelBacklightExtra.Size = new Size(842, 153);
panelBacklightExtra.Size = new Size(948, 194);
panelBacklightExtra.TabIndex = 43;
//
// numericBacklightTime
//
numericBacklightTime.Location = new Point(655, 133);
numericBacklightTime.Maximum = new decimal(new int[] { 3600, 0, 0, 0 });
numericBacklightTime.Name = "numericBacklightTime";
numericBacklightTime.Size = new Size(240, 39);
numericBacklightTime.TabIndex = 47;
//
// labelBacklightTimeout
//
labelBacklightTimeout.Location = new Point(13, 135);
labelBacklightTimeout.Name = "labelBacklightTimeout";
labelBacklightTimeout.Size = new Size(636, 45);
labelBacklightTimeout.TabIndex = 46;
labelBacklightTimeout.Text = "Seconds to turn off backlight on battery";
//
// labelBrightness
//
labelBrightness.Location = new Point(13, 76);
labelBrightness.Location = new Point(13, 75);
labelBrightness.Name = "labelBrightness";
labelBrightness.Size = new Size(197, 49);
labelBrightness.Size = new Size(336, 43);
labelBrightness.TabIndex = 41;
labelBrightness.Text = "Brightness";
//
// trackBrightness
//
trackBrightness.Location = new Point(216, 60);
trackBrightness.LargeChange = 1;
trackBrightness.Location = new Point(355, 60);
trackBrightness.Maximum = 3;
trackBrightness.Name = "trackBrightness";
trackBrightness.Size = new Size(600, 90);
trackBrightness.Size = new Size(558, 90);
trackBrightness.TabIndex = 42;
trackBrightness.TickStyle = TickStyle.TopLeft;
//
// labelSpeed
//
labelSpeed.AutoSize = true;
labelSpeed.Location = new Point(13, 15);
labelSpeed.MaximumSize = new Size(200, 0);
labelSpeed.Name = "labelSpeed";
labelSpeed.Size = new Size(198, 32);
labelSpeed.Size = new Size(538, 40);
labelSpeed.TabIndex = 44;
labelSpeed.Text = "Animation Speed";
//
@@ -263,7 +372,7 @@ namespace GHelper
comboKeyboardSpeed.FormattingEnabled = true;
comboKeyboardSpeed.ItemHeight = 32;
comboKeyboardSpeed.Items.AddRange(new object[] { "Slow", "Normal", "Fast" });
comboKeyboardSpeed.Location = new Point(220, 12);
comboKeyboardSpeed.Location = new Point(607, 15);
comboKeyboardSpeed.Margin = new Padding(4, 10, 4, 8);
comboKeyboardSpeed.Name = "comboKeyboardSpeed";
comboKeyboardSpeed.Size = new Size(291, 40);
@@ -276,7 +385,7 @@ namespace GHelper
panelXMG.Dock = DockStyle.Top;
panelXMG.Location = new Point(3, 261);
panelXMG.Name = "panelXMG";
panelXMG.Size = new Size(842, 58);
panelXMG.Size = new Size(948, 58);
panelXMG.TabIndex = 42;
//
// checkXMG
@@ -328,247 +437,269 @@ namespace GHelper
tableBacklight.RowStyles.Add(new RowStyle());
tableBacklight.RowStyles.Add(new RowStyle());
tableBacklight.RowStyles.Add(new RowStyle());
tableBacklight.Size = new Size(842, 226);
tableBacklight.Size = new Size(948, 226);
tableBacklight.TabIndex = 41;
//
// labelBacklight
//
labelBacklight.AutoSize = true;
labelBacklight.Dock = DockStyle.Fill;
labelBacklight.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBacklight.Location = new Point(3, 0);
labelBacklight.Name = "labelBacklight";
labelBacklight.Padding = new Padding(10, 5, 5, 5);
labelBacklight.Size = new Size(139, 42);
labelBacklight.Size = new Size(231, 42);
labelBacklight.TabIndex = 6;
labelBacklight.Text = "Keyboard";
//
// checkAwake
//
checkAwake.AutoSize = true;
checkAwake.Dock = DockStyle.Fill;
checkAwake.Location = new Point(3, 45);
checkAwake.Name = "checkAwake";
checkAwake.Padding = new Padding(15, 2, 5, 2);
checkAwake.Size = new Size(135, 40);
checkAwake.Size = new Size(231, 40);
checkAwake.TabIndex = 1;
checkAwake.Text = Strings.Awake;
checkAwake.UseVisualStyleBackColor = true;
//
// checkBoot
//
checkBoot.AutoSize = true;
checkBoot.Dock = DockStyle.Fill;
checkBoot.Location = new Point(3, 91);
checkBoot.Name = "checkBoot";
checkBoot.Padding = new Padding(15, 2, 5, 2);
checkBoot.Size = new Size(116, 40);
checkBoot.Size = new Size(231, 40);
checkBoot.TabIndex = 2;
checkBoot.Text = Strings.Boot;
checkBoot.UseVisualStyleBackColor = true;
//
// checkSleep
//
checkSleep.AutoSize = true;
checkSleep.Dock = DockStyle.Fill;
checkSleep.Location = new Point(3, 137);
checkSleep.Name = "checkSleep";
checkSleep.Padding = new Padding(15, 2, 5, 2);
checkSleep.Size = new Size(125, 40);
checkSleep.Size = new Size(231, 40);
checkSleep.TabIndex = 3;
checkSleep.Text = Strings.Sleep;
checkSleep.Text = "Sleep";
checkSleep.UseVisualStyleBackColor = true;
//
// checkShutdown
//
checkShutdown.AutoSize = true;
checkShutdown.Dock = DockStyle.Fill;
checkShutdown.Location = new Point(3, 183);
checkShutdown.Name = "checkShutdown";
checkShutdown.Padding = new Padding(15, 2, 5, 2);
checkShutdown.Size = new Size(174, 40);
checkShutdown.Size = new Size(231, 40);
checkShutdown.TabIndex = 4;
checkShutdown.Text = Strings.Shutdown;
checkShutdown.UseVisualStyleBackColor = true;
//
// labelBacklightLogo
//
labelBacklightLogo.AutoSize = true;
labelBacklightLogo.Dock = DockStyle.Fill;
labelBacklightLogo.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBacklightLogo.Location = new Point(213, 0);
labelBacklightLogo.Location = new Point(240, 0);
labelBacklightLogo.Name = "labelBacklightLogo";
labelBacklightLogo.Padding = new Padding(10, 5, 5, 5);
labelBacklightLogo.Size = new Size(86, 42);
labelBacklightLogo.Size = new Size(231, 42);
labelBacklightLogo.TabIndex = 21;
labelBacklightLogo.Text = "Logo";
//
// checkAwakeLogo
//
checkAwakeLogo.AutoSize = true;
checkAwakeLogo.Location = new Point(213, 45);
checkAwakeLogo.Dock = DockStyle.Fill;
checkAwakeLogo.Location = new Point(240, 45);
checkAwakeLogo.Name = "checkAwakeLogo";
checkAwakeLogo.Padding = new Padding(15, 2, 5, 2);
checkAwakeLogo.Size = new Size(135, 40);
checkAwakeLogo.Size = new Size(231, 40);
checkAwakeLogo.TabIndex = 17;
checkAwakeLogo.Text = Strings.Awake;
checkAwakeLogo.UseVisualStyleBackColor = true;
//
// checkBootLogo
//
checkBootLogo.AutoSize = true;
checkBootLogo.Location = new Point(213, 91);
checkBootLogo.Dock = DockStyle.Fill;
checkBootLogo.Location = new Point(240, 91);
checkBootLogo.Name = "checkBootLogo";
checkBootLogo.Padding = new Padding(15, 2, 5, 2);
checkBootLogo.Size = new Size(116, 40);
checkBootLogo.Size = new Size(231, 40);
checkBootLogo.TabIndex = 18;
checkBootLogo.Text = Strings.Boot;
checkBootLogo.UseVisualStyleBackColor = true;
//
// checkSleepLogo
//
checkSleepLogo.AutoSize = true;
checkSleepLogo.Location = new Point(213, 137);
checkSleepLogo.Dock = DockStyle.Fill;
checkSleepLogo.Location = new Point(240, 137);
checkSleepLogo.Name = "checkSleepLogo";
checkSleepLogo.Padding = new Padding(15, 2, 5, 2);
checkSleepLogo.Size = new Size(125, 40);
checkSleepLogo.Size = new Size(231, 40);
checkSleepLogo.TabIndex = 19;
checkSleepLogo.Text = Strings.Sleep;
checkSleepLogo.UseVisualStyleBackColor = true;
//
// checkShutdownLogo
//
checkShutdownLogo.AutoSize = true;
checkShutdownLogo.Location = new Point(213, 183);
checkShutdownLogo.Dock = DockStyle.Fill;
checkShutdownLogo.Location = new Point(240, 183);
checkShutdownLogo.Name = "checkShutdownLogo";
checkShutdownLogo.Padding = new Padding(15, 2, 5, 2);
checkShutdownLogo.Size = new Size(174, 40);
checkShutdownLogo.Size = new Size(231, 40);
checkShutdownLogo.TabIndex = 20;
checkShutdownLogo.Text = Strings.Shutdown;
checkShutdownLogo.UseVisualStyleBackColor = true;
//
// labelBacklightBar
//
labelBacklightBar.AutoSize = true;
labelBacklightBar.Dock = DockStyle.Fill;
labelBacklightBar.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBacklightBar.Location = new Point(423, 0);
labelBacklightBar.Location = new Point(477, 0);
labelBacklightBar.Name = "labelBacklightBar";
labelBacklightBar.Padding = new Padding(10, 5, 5, 5);
labelBacklightBar.Size = new Size(124, 42);
labelBacklightBar.Size = new Size(231, 42);
labelBacklightBar.TabIndex = 11;
labelBacklightBar.Text = "Lightbar";
//
// checkAwakeBar
//
checkAwakeBar.AutoSize = true;
checkAwakeBar.Location = new Point(423, 45);
checkAwakeBar.Dock = DockStyle.Fill;
checkAwakeBar.Location = new Point(477, 45);
checkAwakeBar.Name = "checkAwakeBar";
checkAwakeBar.Padding = new Padding(15, 2, 5, 2);
checkAwakeBar.Size = new Size(135, 40);
checkAwakeBar.Size = new Size(231, 40);
checkAwakeBar.TabIndex = 7;
checkAwakeBar.Text = Strings.Awake;
checkAwakeBar.UseVisualStyleBackColor = true;
//
// checkBootBar
//
checkBootBar.AutoSize = true;
checkBootBar.Location = new Point(423, 91);
checkBootBar.Dock = DockStyle.Fill;
checkBootBar.Location = new Point(477, 91);
checkBootBar.Name = "checkBootBar";
checkBootBar.Padding = new Padding(15, 2, 5, 2);
checkBootBar.Size = new Size(116, 40);
checkBootBar.Size = new Size(231, 40);
checkBootBar.TabIndex = 8;
checkBootBar.Text = Strings.Boot;
checkBootBar.UseVisualStyleBackColor = true;
//
// checkSleepBar
//
checkSleepBar.AutoSize = true;
checkSleepBar.Location = new Point(423, 137);
checkSleepBar.Dock = DockStyle.Fill;
checkSleepBar.Location = new Point(477, 137);
checkSleepBar.Name = "checkSleepBar";
checkSleepBar.Padding = new Padding(15, 2, 5, 2);
checkSleepBar.Size = new Size(125, 40);
checkSleepBar.Size = new Size(231, 40);
checkSleepBar.TabIndex = 9;
checkSleepBar.Text = Strings.Sleep;
checkSleepBar.UseVisualStyleBackColor = true;
//
// checkShutdownBar
//
checkShutdownBar.AutoSize = true;
checkShutdownBar.Location = new Point(423, 183);
checkShutdownBar.Dock = DockStyle.Fill;
checkShutdownBar.Location = new Point(477, 183);
checkShutdownBar.Name = "checkShutdownBar";
checkShutdownBar.Padding = new Padding(15, 2, 5, 2);
checkShutdownBar.Size = new Size(174, 40);
checkShutdownBar.Size = new Size(231, 40);
checkShutdownBar.TabIndex = 10;
checkShutdownBar.Text = Strings.Shutdown;
checkShutdownBar.UseVisualStyleBackColor = true;
//
// labelBacklightLid
//
labelBacklightLid.AutoSize = true;
labelBacklightLid.Dock = DockStyle.Fill;
labelBacklightLid.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBacklightLid.Location = new Point(633, 0);
labelBacklightLid.Location = new Point(714, 0);
labelBacklightLid.Name = "labelBacklightLid";
labelBacklightLid.Padding = new Padding(10, 5, 5, 5);
labelBacklightLid.Size = new Size(63, 42);
labelBacklightLid.Size = new Size(231, 42);
labelBacklightLid.TabIndex = 16;
labelBacklightLid.Text = "Lid";
//
// checkAwakeLid
//
checkAwakeLid.AutoSize = true;
checkAwakeLid.Location = new Point(633, 45);
checkAwakeLid.Dock = DockStyle.Fill;
checkAwakeLid.Location = new Point(714, 45);
checkAwakeLid.Name = "checkAwakeLid";
checkAwakeLid.Padding = new Padding(15, 2, 5, 2);
checkAwakeLid.Size = new Size(135, 40);
checkAwakeLid.Size = new Size(231, 40);
checkAwakeLid.TabIndex = 12;
checkAwakeLid.Text = Strings.Awake;
checkAwakeLid.UseVisualStyleBackColor = true;
//
// checkBootLid
//
checkBootLid.AutoSize = true;
checkBootLid.Location = new Point(633, 91);
checkBootLid.Dock = DockStyle.Fill;
checkBootLid.Location = new Point(714, 91);
checkBootLid.Name = "checkBootLid";
checkBootLid.Padding = new Padding(15, 2, 5, 2);
checkBootLid.Size = new Size(116, 40);
checkBootLid.Size = new Size(231, 40);
checkBootLid.TabIndex = 13;
checkBootLid.Text = Strings.Boot;
checkBootLid.UseVisualStyleBackColor = true;
//
// checkSleepLid
//
checkSleepLid.AutoSize = true;
checkSleepLid.Location = new Point(633, 137);
checkSleepLid.Dock = DockStyle.Fill;
checkSleepLid.Location = new Point(714, 137);
checkSleepLid.Name = "checkSleepLid";
checkSleepLid.Padding = new Padding(15, 2, 5, 2);
checkSleepLid.Size = new Size(125, 40);
checkSleepLid.Size = new Size(231, 40);
checkSleepLid.TabIndex = 14;
checkSleepLid.Text = Strings.Sleep;
checkSleepLid.UseVisualStyleBackColor = true;
//
// checkShutdownLid
//
checkShutdownLid.AutoSize = true;
checkShutdownLid.Location = new Point(633, 183);
checkShutdownLid.Dock = DockStyle.Fill;
checkShutdownLid.Location = new Point(714, 183);
checkShutdownLid.Name = "checkShutdownLid";
checkShutdownLid.Padding = new Padding(15, 2, 5, 2);
checkShutdownLid.Size = new Size(174, 40);
checkShutdownLid.Size = new Size(231, 40);
checkShutdownLid.TabIndex = 15;
checkShutdownLid.Text = Strings.Shutdown;
checkShutdownLid.UseVisualStyleBackColor = true;
//
// groupOther
//
groupOther.Controls.Add(checkAutoApplyWindowsPowerMode);
groupOther.Controls.Add(checkKeyboardAuto);
groupOther.Controls.Add(checkUSBC);
groupOther.Controls.Add(checkNoOverdrive);
groupOther.Controls.Add(checkKeyboardAuto);
groupOther.Controls.Add(checkTopmost);
groupOther.Dock = DockStyle.Top;
groupOther.Location = new Point(10, 727);
groupOther.Location = new Point(10, 850);
groupOther.Name = "groupOther";
groupOther.Size = new Size(848, 293);
groupOther.Size = new Size(954, 276);
groupOther.TabIndex = 2;
groupOther.TabStop = false;
groupOther.Text = "Other";
//
// checkAutoApplyWindowsPowerMode
//
checkAutoApplyWindowsPowerMode.AutoSize = true;
checkAutoApplyWindowsPowerMode.Location = new Point(25, 220);
checkAutoApplyWindowsPowerMode.Name = "checkAutoApplyWindowsPowerMode";
checkAutoApplyWindowsPowerMode.Size = new Size(416, 36);
checkAutoApplyWindowsPowerMode.TabIndex = 47;
checkAutoApplyWindowsPowerMode.Text = "Auto Adjust Windows Power Mode";
checkAutoApplyWindowsPowerMode.UseVisualStyleBackColor = true;
//
// checkKeyboardAuto
//
checkKeyboardAuto.AutoSize = true;
checkKeyboardAuto.Location = new Point(25, 40);
checkKeyboardAuto.MaximumSize = new Size(780, 0);
checkKeyboardAuto.Name = "checkKeyboardAuto";
checkKeyboardAuto.Size = new Size(712, 36);
checkKeyboardAuto.TabIndex = 46;
checkKeyboardAuto.Text = Strings.KeyboardAuto;
checkKeyboardAuto.UseVisualStyleBackColor = true;
//
// checkUSBC
//
checkUSBC.AutoSize = true;
checkUSBC.Location = new Point(25, 210);
checkUSBC.Location = new Point(25, 85);
checkUSBC.Name = "checkUSBC";
checkUSBC.Size = new Size(659, 36);
checkUSBC.TabIndex = 4;
@@ -578,28 +709,17 @@ namespace GHelper
// checkNoOverdrive
//
checkNoOverdrive.AutoSize = true;
checkNoOverdrive.Location = new Point(25, 156);
checkNoOverdrive.Location = new Point(25, 130);
checkNoOverdrive.Name = "checkNoOverdrive";
checkNoOverdrive.Size = new Size(307, 36);
checkNoOverdrive.TabIndex = 3;
checkNoOverdrive.Text = Strings.DisableOverdrive;
checkNoOverdrive.UseVisualStyleBackColor = true;
//
// checkKeyboardAuto
//
checkKeyboardAuto.AutoSize = true;
checkKeyboardAuto.Location = new Point(25, 52);
checkKeyboardAuto.MaximumSize = new Size(780, 0);
checkKeyboardAuto.Name = "checkKeyboardAuto";
checkKeyboardAuto.Size = new Size(712, 36);
checkKeyboardAuto.TabIndex = 2;
checkKeyboardAuto.Text = Strings.KeyboardAuto;
checkKeyboardAuto.UseVisualStyleBackColor = true;
//
// checkTopmost
//
checkTopmost.AutoSize = true;
checkTopmost.Location = new Point(25, 104);
checkTopmost.Location = new Point(25, 175);
checkTopmost.Name = "checkTopmost";
checkTopmost.Size = new Size(390, 36);
checkTopmost.TabIndex = 1;
@@ -610,7 +730,9 @@ namespace GHelper
//
AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(868, 1011);
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(974, 1131);
Controls.Add(groupOther);
Controls.Add(groupLight);
Controls.Add(groupBindings);
@@ -618,23 +740,25 @@ namespace GHelper
MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false;
MinimumSize = new Size(1000, 0);
Name = "Extra";
Padding = new Padding(10);
ShowIcon = false;
ShowInTaskbar = false;
Text = "Extra Settings";
groupBindings.ResumeLayout(false);
groupBindings.PerformLayout();
tableKeys.ResumeLayout(false);
tableKeys.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureHelp).EndInit();
groupLight.ResumeLayout(false);
groupLight.PerformLayout();
panelBacklightExtra.ResumeLayout(false);
panelBacklightExtra.PerformLayout();
((System.ComponentModel.ISupportInitialize)numericBacklightTime).EndInit();
((System.ComponentModel.ISupportInitialize)trackBrightness).EndInit();
panelXMG.ResumeLayout(false);
panelXMG.PerformLayout();
tableBacklight.ResumeLayout(false);
tableBacklight.PerformLayout();
groupOther.ResumeLayout(false);
groupOther.PerformLayout();
ResumeLayout(false);
@@ -656,7 +780,6 @@ namespace GHelper
private GroupBox groupLight;
private GroupBox groupOther;
private CheckBox checkTopmost;
private CheckBox checkKeyboardAuto;
private CheckBox checkNoOverdrive;
private PictureBox pictureHelp;
private CheckBox checkUSBC;
@@ -688,5 +811,16 @@ namespace GHelper
private RComboBox comboKeyboardSpeed;
private Panel panelXMG;
private CheckBox checkXMG;
private Label labelBacklightTimeout;
private NumericUpDown numericBacklightTime;
private CheckBox checkKeyboardAuto;
private CheckBox checkAutoApplyWindowsPowerMode;
private TableLayoutPanel tableKeys;
private Label labelM1;
private Label labelM2;
private RComboBox comboM1;
private RComboBox comboM2;
private TextBox textM2;
private TextBox textM1;
}
}

View File

@@ -21,13 +21,25 @@ namespace GHelper
private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)
{
if (name == "m4")
customActions[""] = Properties.Strings.OpenGHelper;
if (name == "fnf4")
switch (name)
{
customActions[""] = Properties.Strings.ToggleAura;
customActions.Remove("aura");
case "m1":
customActions[""] = Properties.Strings.VolumeDown;
break;
case "m2":
customActions[""] = Properties.Strings.VolumeUp;
break;
case "m3":
customActions[""] = Properties.Strings.MuteMic;
break;
case "m4":
customActions[""] = Properties.Strings.OpenGHelper;
break;
case "fnf4":
customActions[""] = Properties.Strings.ToggleAura;
customActions.Remove("aura");
break;
}
combo.DropDownStyle = ComboBoxStyle.DropDownList;
@@ -35,7 +47,7 @@ namespace GHelper
combo.DisplayMember = "Value";
combo.ValueMember = "Key";
string action = Program.config.getConfigString(name);
string action = AppConfig.getConfigString(name);
combo.SelectedValue = (action is not null) ? action : "";
if (combo.SelectedValue is null) combo.SelectedValue = "";
@@ -43,13 +55,17 @@ namespace GHelper
combo.SelectedValueChanged += delegate
{
if (combo.SelectedValue is not null)
Program.config.setConfig(name, combo.SelectedValue.ToString());
AppConfig.setConfig(name, combo.SelectedValue.ToString());
if (name == "m1" || name == "m2")
Program.inputDispatcher.RegisterKeys();
};
txbox.Text = Program.config.getConfigString(name + "_custom");
txbox.Text = AppConfig.getConfigString(name + "_custom");
txbox.TextChanged += delegate
{
Program.config.setConfig(name + "_custom", txbox.Text);
AppConfig.setConfig(name + "_custom", txbox.Text);
};
}
@@ -68,11 +84,13 @@ namespace GHelper
labelSpeed.Text = Properties.Strings.AnimationSpeed;
labelBrightness.Text = Properties.Strings.Brightness;
labelBacklightTimeout.Text = Properties.Strings.BacklightTimeout;
checkKeyboardAuto.Text = Properties.Strings.KeyboardAuto;
checkNoOverdrive.Text = Properties.Strings.DisableOverdrive;
checkTopmost.Text = Properties.Strings.WindowTop;
checkUSBC.Text = Properties.Strings.OptimizedUSBC;
checkAutoApplyWindowsPowerMode.Text = Properties.Strings.ApplyWindowsPowerPlan;
labelBacklight.Text = Properties.Strings.Keyboard;
labelBacklightBar.Text = Properties.Strings.Lightbar;
@@ -83,6 +101,8 @@ namespace GHelper
InitTheme();
SetKeyCombo(comboM1, textM1, "m1");
SetKeyCombo(comboM2, textM2, "m2");
SetKeyCombo(comboM3, textM3, "m3");
SetKeyCombo(comboM4, textM4, "m4");
SetKeyCombo(comboFNF4, textFNF4, "fnf4");
@@ -90,35 +110,35 @@ namespace GHelper
Shown += Keyboard_Shown;
comboKeyboardSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
comboKeyboardSpeed.DataSource = new BindingSource(Aura.GetSpeeds(), null);
comboKeyboardSpeed.DataSource = new BindingSource(AsusUSB.GetSpeeds(), null);
comboKeyboardSpeed.DisplayMember = "Value";
comboKeyboardSpeed.ValueMember = "Key";
comboKeyboardSpeed.SelectedValue = Aura.Speed;
comboKeyboardSpeed.SelectedValue = AsusUSB.Speed;
comboKeyboardSpeed.SelectedValueChanged += ComboKeyboardSpeed_SelectedValueChanged;
// Keyboard
checkAwake.Checked = !(Program.config.getConfig("keyboard_awake") == 0);
checkBoot.Checked = !(Program.config.getConfig("keyboard_boot") == 0);
checkSleep.Checked = !(Program.config.getConfig("keyboard_sleep") == 0);
checkShutdown.Checked = !(Program.config.getConfig("keyboard_shutdown") == 0);
checkAwake.Checked = !(AppConfig.getConfig("keyboard_awake") == 0);
checkBoot.Checked = !(AppConfig.getConfig("keyboard_boot") == 0);
checkSleep.Checked = !(AppConfig.getConfig("keyboard_sleep") == 0);
checkShutdown.Checked = !(AppConfig.getConfig("keyboard_shutdown") == 0);
// Lightbar
checkAwakeBar.Checked = !(Program.config.getConfig("keyboard_awake_bar") == 0);
checkBootBar.Checked = !(Program.config.getConfig("keyboard_boot_bar") == 0);
checkSleepBar.Checked = !(Program.config.getConfig("keyboard_sleep_bar") == 0);
checkShutdownBar.Checked = !(Program.config.getConfig("keyboard_shutdown_bar") == 0);
checkAwakeBar.Checked = !(AppConfig.getConfig("keyboard_awake_bar") == 0);
checkBootBar.Checked = !(AppConfig.getConfig("keyboard_boot_bar") == 0);
checkSleepBar.Checked = !(AppConfig.getConfig("keyboard_sleep_bar") == 0);
checkShutdownBar.Checked = !(AppConfig.getConfig("keyboard_shutdown_bar") == 0);
// Lid
checkAwakeLid.Checked = !(Program.config.getConfig("keyboard_awake_lid") == 0);
checkBootLid.Checked = !(Program.config.getConfig("keyboard_boot_lid") == 0);
checkSleepLid.Checked = !(Program.config.getConfig("keyboard_sleep_lid") == 0);
checkShutdownLid.Checked = !(Program.config.getConfig("keyboard_shutdown_lid") == 0);
checkAwakeLid.Checked = !(AppConfig.getConfig("keyboard_awake_lid") == 0);
checkBootLid.Checked = !(AppConfig.getConfig("keyboard_boot_lid") == 0);
checkSleepLid.Checked = !(AppConfig.getConfig("keyboard_sleep_lid") == 0);
checkShutdownLid.Checked = !(AppConfig.getConfig("keyboard_shutdown_lid") == 0);
// Logo
checkAwakeLogo.Checked = !(Program.config.getConfig("keyboard_awake_logo") == 0);
checkBootLogo.Checked = !(Program.config.getConfig("keyboard_boot_logo") == 0);
checkSleepLogo.Checked = !(Program.config.getConfig("keyboard_sleep_logo") == 0);
checkShutdownLogo.Checked = !(Program.config.getConfig("keyboard_shutdown_logo") == 0);
checkAwakeLogo.Checked = !(AppConfig.getConfig("keyboard_awake_logo") == 0);
checkBootLogo.Checked = !(AppConfig.getConfig("keyboard_boot_logo") == 0);
checkSleepLogo.Checked = !(AppConfig.getConfig("keyboard_sleep_logo") == 0);
checkShutdownLogo.Checked = !(AppConfig.getConfig("keyboard_shutdown_logo") == 0);
checkAwake.CheckedChanged += CheckPower_CheckedChanged;
checkBoot.CheckedChanged += CheckPower_CheckedChanged;
@@ -140,7 +160,7 @@ namespace GHelper
checkSleepLogo.CheckedChanged += CheckPower_CheckedChanged;
checkShutdownLogo.CheckedChanged += CheckPower_CheckedChanged;
if (!Program.config.ContainsModel("Strix"))
if (!AppConfig.ContainsModel("Strix"))
{
labelBacklightBar.Visible = false;
checkAwakeBar.Visible = false;
@@ -148,7 +168,7 @@ namespace GHelper
checkSleepBar.Visible = false;
checkShutdownBar.Visible = false;
if (!Program.config.ContainsModel("Z13"))
if (!AppConfig.ContainsModel("Z13"))
{
labelBacklightLid.Visible = false;
checkAwakeLid.Visible = false;
@@ -164,46 +184,60 @@ namespace GHelper
}
}
checkTopmost.Checked = (Program.config.getConfig("topmost") == 1);
checkTopmost.Checked = (AppConfig.getConfig("topmost") == 1);
checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ;
checkKeyboardAuto.Checked = (Program.config.getConfig("keyboard_auto") == 1);
checkKeyboardAuto.Checked = (AppConfig.getConfig("keyboard_auto") == 1);
checkKeyboardAuto.CheckedChanged += CheckKeyboardAuto_CheckedChanged;
checkNoOverdrive.Checked = (Program.config.getConfig("no_overdrive") == 1);
checkNoOverdrive.Checked = (AppConfig.getConfig("no_overdrive") == 1);
checkNoOverdrive.CheckedChanged += CheckNoOverdrive_CheckedChanged;
checkUSBC.Checked = (Program.config.getConfig("optimized_usbc") == 1);
checkUSBC.Checked = (AppConfig.getConfig("optimized_usbc") == 1);
checkUSBC.CheckedChanged += CheckUSBC_CheckedChanged;
int kb_brightness = Program.config.getConfig("keyboard_brightness");
checkAutoApplyWindowsPowerMode.Checked = (AppConfig.getConfig("auto_apply_power_plan") != 0);
checkAutoApplyWindowsPowerMode.CheckedChanged += checkAutoApplyWindowsPowerMode_CheckedChanged;
int kb_brightness = AppConfig.getConfig("keyboard_brightness");
trackBrightness.Value = (kb_brightness >= 0 && kb_brightness <= 3) ? kb_brightness : 3;
pictureHelp.Click += PictureHelp_Click;
trackBrightness.Scroll += TrackBrightness_Scroll;
panelXMG.Visible = (Program.wmi.DeviceGet(ASUSWmi.GPUXGConnected) == 1);
checkXMG.Checked = !(Program.config.getConfig("xmg_light") == 0);
panelXMG.Visible = (Program.acpi.DeviceGet(AsusACPI.GPUXGConnected) == 1);
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.ValueChanged += NumericBacklightTime_ValueChanged;
}
private void NumericBacklightTime_ValueChanged(object? sender, EventArgs e)
{
Program.RunAsAdmin("extra");
AppConfig.setConfig("keyboard_light_tiomeout", (int)numericBacklightTime.Value);
AsusUSB.SetBacklightOffDelay((int)numericBacklightTime.Value);
}
private void CheckXMG_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("xmg_light", (checkXMG.Checked ? 1 : 0));
Aura.ApplyXGMLight(checkXMG.Checked);
AppConfig.setConfig("xmg_light", (checkXMG.Checked ? 1 : 0));
AsusUSB.ApplyXGMLight(checkXMG.Checked);
}
private void CheckUSBC_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("optimized_usbc", (checkUSBC.Checked ? 1 : 0));
AppConfig.setConfig("optimized_usbc", (checkUSBC.Checked ? 1 : 0));
}
private void TrackBrightness_Scroll(object? sender, EventArgs e)
{
Program.config.setConfig("keyboard_brightness", trackBrightness.Value);
Aura.ApplyBrightness(trackBrightness.Value);
AppConfig.setConfig("keyboard_brightness", trackBrightness.Value);
AsusUSB.ApplyBrightness(trackBrightness.Value);
}
private void PictureHelp_Click(object? sender, EventArgs e)
@@ -213,42 +247,42 @@ namespace GHelper
private void CheckNoOverdrive_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("no_overdrive", (checkNoOverdrive.Checked ? 1 : 0));
AppConfig.setConfig("no_overdrive", (checkNoOverdrive.Checked ? 1 : 0));
Program.settingsForm.AutoScreen(true);
}
private void CheckKeyboardAuto_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("keyboard_auto", (checkKeyboardAuto.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_auto", (checkKeyboardAuto.Checked ? 1 : 0));
}
private void CheckTopmost_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("topmost", (checkTopmost.Checked ? 1 : 0));
AppConfig.setConfig("topmost", (checkTopmost.Checked ? 1 : 0));
Program.settingsForm.TopMost = checkTopmost.Checked;
}
private void CheckPower_CheckedChanged(object? sender, EventArgs e)
{
Program.config.setConfig("keyboard_awake", (checkAwake.Checked ? 1 : 0));
Program.config.setConfig("keyboard_boot", (checkBoot.Checked ? 1 : 0));
Program.config.setConfig("keyboard_sleep", (checkSleep.Checked ? 1 : 0));
Program.config.setConfig("keyboard_shutdown", (checkShutdown.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_awake", (checkAwake.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_boot", (checkBoot.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_sleep", (checkSleep.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_shutdown", (checkShutdown.Checked ? 1 : 0));
Program.config.setConfig("keyboard_awake_bar", (checkAwakeBar.Checked ? 1 : 0));
Program.config.setConfig("keyboard_boot_bar", (checkBootBar.Checked ? 1 : 0));
Program.config.setConfig("keyboard_sleep_bar", (checkSleepBar.Checked ? 1 : 0));
Program.config.setConfig("keyboard_shutdown_bar", (checkShutdownBar.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_awake_bar", (checkAwakeBar.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_boot_bar", (checkBootBar.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_sleep_bar", (checkSleepBar.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_shutdown_bar", (checkShutdownBar.Checked ? 1 : 0));
Program.config.setConfig("keyboard_awake_lid", (checkAwakeLid.Checked ? 1 : 0));
Program.config.setConfig("keyboard_boot_lid", (checkBootLid.Checked ? 1 : 0));
Program.config.setConfig("keyboard_sleep_lid", (checkSleepLid.Checked ? 1 : 0));
Program.config.setConfig("keyboard_shutdown_lid", (checkShutdownLid.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_awake_lid", (checkAwakeLid.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_boot_lid", (checkBootLid.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_sleep_lid", (checkSleepLid.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_shutdown_lid", (checkShutdownLid.Checked ? 1 : 0));
Program.config.setConfig("keyboard_awake_logo", (checkAwakeLogo.Checked ? 1 : 0));
Program.config.setConfig("keyboard_boot_logo", (checkBootLogo.Checked ? 1 : 0));
Program.config.setConfig("keyboard_sleep_logo", (checkSleepLogo.Checked ? 1 : 0));
Program.config.setConfig("keyboard_shutdown_logo", (checkShutdownLogo.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_awake_logo", (checkAwakeLogo.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_boot_logo", (checkBootLogo.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_sleep_logo", (checkSleepLogo.Checked ? 1 : 0));
AppConfig.setConfig("keyboard_shutdown_logo", (checkShutdownLogo.Checked ? 1 : 0));
List<AuraDev19b6> flags = new List<AuraDev19b6>();
@@ -272,26 +306,34 @@ namespace GHelper
if (checkSleepLogo.Checked) flags.Add(AuraDev19b6.SleepLogo);
if (checkShutdownLogo.Checked) flags.Add(AuraDev19b6.ShutdownLogo);
flags.Add(AuraDev19b6.Unknown1);
flags.Add(AuraDev19b6.Unknown2);
flags.Add(AuraDev19b6.Unknown3);
flags.Add(AuraDev19b6.Unknown4);
Aura.ApplyAuraPower(flags);
AsusUSB.ApplyAuraPower(flags);
}
private void ComboKeyboardSpeed_SelectedValueChanged(object? sender, EventArgs e)
{
Program.config.setConfig("aura_speed", (int)comboKeyboardSpeed.SelectedValue);
AppConfig.setConfig("aura_speed", (int)comboKeyboardSpeed.SelectedValue);
Program.settingsForm.SetAura();
}
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;
}
private void checkAutoApplyWindowsPowerMode_CheckedChanged(object? sender, EventArgs e)
{
AppConfig.setConfig("auto_apply_power_plan", checkAutoApplyWindowsPowerMode.Checked ? 1 : 0);
}
}
}

View File

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

309
app/Fans.Designer.cs generated
View File

@@ -31,23 +31,28 @@ namespace GHelper
/// </summary>
private void InitializeComponent()
{
ChartArea chartArea1 = new ChartArea();
Title title1 = new Title();
ChartArea chartArea2 = new ChartArea();
Title title2 = new Title();
ChartArea chartArea3 = new ChartArea();
Title title3 = new Title();
ChartArea chartArea9 = new ChartArea();
Title title9 = new Title();
ChartArea chartArea10 = new ChartArea();
Title title10 = new Title();
ChartArea chartArea11 = new ChartArea();
Title title11 = new Title();
ChartArea chartArea12 = new ChartArea();
Title title12 = new Title();
panelFans = new Panel();
labelFansResult = new Label();
labelTip = new Label();
labelBoost = new Label();
comboBoost = new RComboBox();
picturePerf = new PictureBox();
tableFanCharts = new TableLayoutPanel();
chartGPU = new Chart();
chartCPU = new Chart();
chartXGM = new Chart();
chartMid = new Chart();
panelTitleFans = new Panel();
labelBoost = new Label();
comboBoost = new RComboBox();
picturePerf = new PictureBox();
labelFans = new Label();
panelApplyFans = new Panel();
labelFansResult = new Label();
checkApplyFans = new RCheckBox();
buttonReset = new RButton();
panelSliders = new Panel();
@@ -87,11 +92,14 @@ namespace GHelper
pictureGPU = new PictureBox();
labelGPU = new Label();
panelFans.SuspendLayout();
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
tableFanCharts.SuspendLayout();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
((System.ComponentModel.ISupportInitialize)chartXGM).BeginInit();
((System.ComponentModel.ISupportInitialize)chartMid).BeginInit();
panelTitleFans.SuspendLayout();
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
panelApplyFans.SuspendLayout();
panelSliders.SuspendLayout();
panelPower.SuspendLayout();
panelApplyPower.SuspendLayout();
@@ -116,53 +124,132 @@ namespace GHelper
//
// panelFans
//
panelFans.Controls.Add(labelFansResult);
panelFans.AutoSize = true;
panelFans.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panelFans.Controls.Add(labelTip);
panelFans.Controls.Add(labelBoost);
panelFans.Controls.Add(comboBoost);
panelFans.Controls.Add(picturePerf);
panelFans.Controls.Add(tableFanCharts);
panelFans.Controls.Add(labelFans);
panelFans.Controls.Add(checkApplyFans);
panelFans.Controls.Add(buttonReset);
panelFans.Controls.Add(panelTitleFans);
panelFans.Controls.Add(panelApplyFans);
panelFans.Dock = DockStyle.Left;
panelFans.Location = new Point(533, 0);
panelFans.Margin = new Padding(0);
panelFans.MaximumSize = new Size(815, 0);
panelFans.MinimumSize = new Size(815, 0);
panelFans.Name = "panelFans";
panelFans.Padding = new Padding(10);
panelFans.Size = new Size(824, 1189);
panelFans.Padding = new Padding(0, 0, 10, 0);
panelFans.Size = new Size(815, 1189);
panelFans.TabIndex = 12;
//
// labelFansResult
//
labelFansResult.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelFansResult.ForeColor = Color.Red;
labelFansResult.Location = new Point(30, 1073);
labelFansResult.Name = "labelFansResult";
labelFansResult.Size = new Size(760, 32);
labelFansResult.TabIndex = 41;
labelFansResult.TextAlign = ContentAlignment.TopRight;
labelFansResult.Visible = false;
//
// labelTip
//
labelTip.AutoSize = true;
labelTip.BackColor = SystemColors.ControlLightLight;
labelTip.Location = new Point(155, 9);
labelTip.Location = new Point(684, 91);
labelTip.Name = "labelTip";
labelTip.Padding = new Padding(5);
labelTip.Size = new Size(107, 42);
labelTip.TabIndex = 40;
labelTip.Text = "500,300";
//
// tableFanCharts
//
tableFanCharts.AutoSize = true;
tableFanCharts.ColumnCount = 1;
tableFanCharts.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableFanCharts.Controls.Add(chartGPU, 0, 1);
tableFanCharts.Controls.Add(chartCPU, 0, 0);
tableFanCharts.Controls.Add(chartXGM, 0, 2);
tableFanCharts.Controls.Add(chartMid, 0, 2);
tableFanCharts.Dock = DockStyle.Fill;
tableFanCharts.Location = new Point(0, 66);
tableFanCharts.Margin = new Padding(4);
tableFanCharts.Name = "tableFanCharts";
tableFanCharts.Padding = new Padding(10, 0, 10, 10);
tableFanCharts.RowCount = 2;
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 25F));
tableFanCharts.Size = new Size(805, 1007);
tableFanCharts.TabIndex = 36;
//
// chartGPU
//
chartArea9.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea9);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(12, 259);
chartGPU.Margin = new Padding(2, 10, 2, 10);
chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(781, 229);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title9.Name = "Title1";
chartGPU.Titles.Add(title9);
//
// chartCPU
//
chartArea10.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea10);
chartCPU.Dock = DockStyle.Fill;
chartCPU.Location = new Point(12, 10);
chartCPU.Margin = new Padding(2, 10, 2, 10);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(781, 229);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title10.Name = "Title1";
chartCPU.Titles.Add(title10);
//
// chartXGM
//
chartArea11.Name = "ChartAreaXGM";
chartXGM.ChartAreas.Add(chartArea11);
chartXGM.Dock = DockStyle.Fill;
chartXGM.Location = new Point(12, 757);
chartXGM.Margin = new Padding(2, 10, 2, 10);
chartXGM.Name = "chartXGM";
chartXGM.Size = new Size(781, 230);
chartXGM.TabIndex = 14;
chartXGM.Text = "chartXGM";
title11.Name = "Title4";
chartXGM.Titles.Add(title11);
chartXGM.Visible = false;
//
// chartMid
//
chartArea12.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea12);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(12, 508);
chartMid.Margin = new Padding(2, 10, 2, 10);
chartMid.Name = "chartMid";
chartMid.Size = new Size(781, 229);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title12.Name = "Title3";
chartMid.Titles.Add(title12);
chartMid.Visible = false;
//
// panelTitleFans
//
panelTitleFans.Controls.Add(labelBoost);
panelTitleFans.Controls.Add(comboBoost);
panelTitleFans.Controls.Add(picturePerf);
panelTitleFans.Controls.Add(labelFans);
panelTitleFans.Dock = DockStyle.Top;
panelTitleFans.Location = new Point(0, 0);
panelTitleFans.Name = "panelTitleFans";
panelTitleFans.Size = new Size(805, 66);
panelTitleFans.TabIndex = 42;
//
// labelBoost
//
labelBoost.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelBoost.AutoSize = true;
labelBoost.Location = new Point(375, 17);
labelBoost.Location = new Point(356, 20);
labelBoost.Name = "labelBoost";
labelBoost.Size = new Size(125, 32);
labelBoost.TabIndex = 39;
labelBoost.Size = new Size(140, 32);
labelBoost.TabIndex = 43;
labelBoost.Text = "CPU Boost";
labelBoost.TextAlign = ContentAlignment.MiddleRight;
//
@@ -174,106 +261,67 @@ namespace GHelper
comboBoost.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoost.FormattingEnabled = true;
comboBoost.Items.AddRange(new object[] { "Disabled", "Enabled", "Aggressive", "Efficient Enabled", "Efficient Aggressive" });
comboBoost.Location = new Point(526, 15);
comboBoost.Location = new Point(506, 16);
comboBoost.Name = "comboBoost";
comboBoost.Size = new Size(266, 40);
comboBoost.TabIndex = 38;
comboBoost.Size = new Size(287, 40);
comboBoost.TabIndex = 42;
//
// picturePerf
//
picturePerf.BackgroundImage = Properties.Resources.icons8_fan_head_96;
picturePerf.BackgroundImageLayout = ImageLayout.Zoom;
picturePerf.InitialImage = null;
picturePerf.Location = new Point(30, 18);
picturePerf.Location = new Point(20, 18);
picturePerf.Margin = new Padding(4, 2, 4, 2);
picturePerf.Name = "picturePerf";
picturePerf.Size = new Size(36, 38);
picturePerf.TabIndex = 37;
picturePerf.TabIndex = 41;
picturePerf.TabStop = false;
//
// tableFanCharts
//
tableFanCharts.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
tableFanCharts.ColumnCount = 1;
tableFanCharts.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
tableFanCharts.Controls.Add(chartGPU, 0, 1);
tableFanCharts.Controls.Add(chartCPU, 0, 0);
tableFanCharts.Controls.Add(chartMid, 0, 2);
tableFanCharts.Location = new Point(28, 64);
tableFanCharts.Margin = new Padding(4);
tableFanCharts.Name = "tableFanCharts";
tableFanCharts.RowCount = 2;
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
tableFanCharts.Size = new Size(764, 1022);
tableFanCharts.TabIndex = 36;
//
// chartGPU
//
chartArea1.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea1);
chartGPU.Dock = DockStyle.Fill;
chartGPU.Location = new Point(2, 350);
chartGPU.Margin = new Padding(2, 10, 2, 10);
chartGPU.Name = "chartGPU";
chartGPU.Size = new Size(760, 320);
chartGPU.TabIndex = 17;
chartGPU.Text = "chartGPU";
title1.Name = "Title1";
chartGPU.Titles.Add(title1);
//
// chartCPU
//
chartArea2.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea2);
chartCPU.Dock = DockStyle.Fill;
chartCPU.Location = new Point(2, 10);
chartCPU.Margin = new Padding(2, 10, 2, 10);
chartCPU.Name = "chartCPU";
chartCPU.Size = new Size(760, 320);
chartCPU.TabIndex = 14;
chartCPU.Text = "chartCPU";
title2.Name = "Title1";
chartCPU.Titles.Add(title2);
//
// chartMid
//
chartArea3.Name = "ChartArea3";
chartMid.ChartAreas.Add(chartArea3);
chartMid.Dock = DockStyle.Fill;
chartMid.Location = new Point(2, 690);
chartMid.Margin = new Padding(2, 10, 2, 10);
chartMid.Name = "chartMid";
chartMid.Size = new Size(760, 322);
chartMid.TabIndex = 14;
chartMid.Text = "chartMid";
title3.Name = "Title3";
chartMid.Titles.Add(title3);
chartMid.Visible = false;
//
// labelFans
//
labelFans.AutoSize = true;
labelFans.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelFans.Location = new Point(66, 20);
labelFans.Location = new Point(62, 20);
labelFans.Margin = new Padding(4, 0, 4, 0);
labelFans.Name = "labelFans";
labelFans.Size = new Size(138, 32);
labelFans.TabIndex = 28;
labelFans.TabIndex = 40;
labelFans.Text = "Fan Curves";
//
// panelApplyFans
//
panelApplyFans.Controls.Add(labelFansResult);
panelApplyFans.Controls.Add(checkApplyFans);
panelApplyFans.Controls.Add(buttonReset);
panelApplyFans.Dock = DockStyle.Bottom;
panelApplyFans.Location = new Point(0, 1073);
panelApplyFans.Name = "panelApplyFans";
panelApplyFans.Size = new Size(805, 116);
panelApplyFans.TabIndex = 43;
//
// labelFansResult
//
labelFansResult.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
labelFansResult.ForeColor = Color.Red;
labelFansResult.Location = new Point(25, 3);
labelFansResult.Name = "labelFansResult";
labelFansResult.Size = new Size(760, 32);
labelFansResult.TabIndex = 42;
labelFansResult.TextAlign = ContentAlignment.TopRight;
labelFansResult.Visible = false;
//
// checkApplyFans
//
checkApplyFans.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
checkApplyFans.AutoSize = true;
checkApplyFans.BackColor = SystemColors.ControlLight;
checkApplyFans.Location = new Point(449, 1118);
checkApplyFans.Location = new Point(453, 45);
checkApplyFans.Margin = new Padding(4, 2, 4, 2);
checkApplyFans.Name = "checkApplyFans";
checkApplyFans.Padding = new Padding(15, 5, 15, 5);
checkApplyFans.Size = new Size(339, 46);
checkApplyFans.TabIndex = 17;
checkApplyFans.TabIndex = 19;
checkApplyFans.Text = Properties.Strings.ApplyFanCurve;
checkApplyFans.UseVisualStyleBackColor = false;
//
@@ -285,12 +333,12 @@ namespace GHelper
buttonReset.BorderColor = Color.Transparent;
buttonReset.BorderRadius = 2;
buttonReset.FlatStyle = FlatStyle.Flat;
buttonReset.Location = new Point(30, 1112);
buttonReset.Location = new Point(12, 38);
buttonReset.Margin = new Padding(4, 2, 4, 2);
buttonReset.Name = "buttonReset";
buttonReset.Secondary = true;
buttonReset.Size = new Size(232, 54);
buttonReset.TabIndex = 15;
buttonReset.TabIndex = 18;
buttonReset.Text = Properties.Strings.FactoryDefaults;
buttonReset.UseVisualStyleBackColor = false;
//
@@ -325,10 +373,10 @@ namespace GHelper
//
panelApplyPower.Controls.Add(checkApplyPower);
panelApplyPower.Dock = DockStyle.Bottom;
panelApplyPower.Location = new Point(0, 445);
panelApplyPower.Location = new Point(0, 447);
panelApplyPower.Name = "panelApplyPower";
panelApplyPower.Padding = new Padding(10);
panelApplyPower.Size = new Size(523, 92);
panelApplyPower.Size = new Size(523, 90);
panelApplyPower.TabIndex = 44;
//
// checkApplyPower
@@ -336,7 +384,7 @@ namespace GHelper
checkApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
checkApplyPower.AutoSize = true;
checkApplyPower.BackColor = SystemColors.ControlLight;
checkApplyPower.Location = new Point(18, 22);
checkApplyPower.Location = new Point(18, 20);
checkApplyPower.Margin = new Padding(10);
checkApplyPower.Name = "checkApplyPower";
checkApplyPower.Padding = new Padding(15, 5, 15, 5);
@@ -724,7 +772,7 @@ namespace GHelper
//
labelGPU.AutoSize = true;
labelGPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelGPU.Location = new Point(62, 21);
labelGPU.Location = new Point(62, 20);
labelGPU.Margin = new Padding(4, 0, 4, 0);
labelGPU.Name = "labelGPU";
labelGPU.Size = new Size(162, 32);
@@ -737,26 +785,31 @@ namespace GHelper
AutoScaleMode = AutoScaleMode.Dpi;
AutoSize = true;
AutoSizeMode = AutoSizeMode.GrowAndShrink;
ClientSize = new Size(1361, 1189);
ClientSize = new Size(1340, 1189);
Controls.Add(panelFans);
Controls.Add(panelSliders);
Margin = new Padding(4, 2, 4, 2);
MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false;
MinimumSize = new Size(26, 1260);
MinimumSize = new Size(0, 1200);
Name = "Fans";
ShowIcon = false;
ShowInTaskbar = false;
StartPosition = FormStartPosition.CenterScreen;
StartPosition = FormStartPosition.Manual;
Text = "Fans and Power";
panelFans.ResumeLayout(false);
panelFans.PerformLayout();
((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();
tableFanCharts.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();
((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();
((System.ComponentModel.ISupportInitialize)chartXGM).EndInit();
((System.ComponentModel.ISupportInitialize)chartMid).EndInit();
panelTitleFans.ResumeLayout(false);
panelTitleFans.PerformLayout();
((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();
panelApplyFans.ResumeLayout(false);
panelApplyFans.PerformLayout();
panelSliders.ResumeLayout(false);
panelSliders.PerformLayout();
panelPower.ResumeLayout(false);
@@ -790,23 +843,18 @@ namespace GHelper
panelTitleGPU.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureGPU).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
private Panel panelFans;
private RCheckBox checkApplyFans;
private RButton buttonReset;
private Panel panelSliders;
private TableLayoutPanel tableFanCharts;
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
private System.Windows.Forms.DataVisualization.Charting.Chart chartCPU;
private System.Windows.Forms.DataVisualization.Charting.Chart chartMid;
private Label labelFans;
private PictureBox picturePerf;
private RComboBox comboBoost;
private Label labelBoost;
private Chart chartGPU;
private Chart chartCPU;
private Chart chartMid;
private Chart chartXGM;
private Label labelTip;
private Label labelFansResult;
private Panel panelPower;
private Label labelInfo;
private Panel panelCPU;
@@ -842,5 +890,14 @@ namespace GHelper
private Label labelGPUTemp;
private Label labelGPUTempTitle;
private TrackBar trackGPUTemp;
private Panel panelTitleFans;
private Panel panelApplyFans;
private Label labelFansResult;
private RCheckBox checkApplyFans;
private RButton buttonReset;
private Label labelBoost;
private RComboBox comboBoost;
private PictureBox picturePerf;
private Label labelFans;
}
}

View File

@@ -12,9 +12,14 @@ namespace GHelper
Series seriesCPU;
Series seriesGPU;
Series seriesMid;
Series seriesXGM;
static int MinRPM, MaxRPM;
static bool powerVisible = true, gpuVisible = true;
const int fansMax = 100;
NvidiaGpuControl? nvControl = null;
public Fans()
@@ -34,6 +39,11 @@ namespace GHelper
labelGPU.Text = Properties.Strings.GPUSettings;
labelGPUCoreTitle.Text = Properties.Strings.GPUCoreClockOffset;
labelGPUMemoryTitle.Text = Properties.Strings.GPUMemoryClockOffset;
labelGPUBoostTitle.Text = Properties.Strings.GPUBoost;
labelGPUTempTitle.Text = Properties.Strings.GPUTempTarget;
InitTheme();
MinRPM = 18;
@@ -46,10 +56,12 @@ namespace GHelper
seriesCPU = chartCPU.Series.Add("CPU");
seriesGPU = chartGPU.Series.Add("GPU");
seriesMid = chartMid.Series.Add("Mid");
seriesXGM = chartXGM.Series.Add("XGM");
seriesCPU.Color = colorStandard;
seriesGPU.Color = colorTurbo;
seriesMid.Color = colorEco;
seriesXGM.Color = Color.Orange;
chartCPU.MouseMove += ChartCPU_MouseMove;
chartCPU.MouseUp += ChartCPU_MouseUp;
@@ -60,13 +72,16 @@ namespace GHelper
chartMid.MouseMove += ChartCPU_MouseMove;
chartMid.MouseUp += ChartCPU_MouseUp;
chartXGM.MouseMove += ChartCPU_MouseMove;
chartXGM.MouseUp += ChartCPU_MouseUp;
buttonReset.Click += ButtonReset_Click;
trackTotal.Maximum = ASUSWmi.MaxTotal;
trackTotal.Minimum = ASUSWmi.MinTotal;
trackTotal.Maximum = AsusACPI.MaxTotal;
trackTotal.Minimum = AsusACPI.MinTotal;
trackCPU.Maximum = ASUSWmi.MaxCPU;
trackCPU.Minimum = ASUSWmi.MinCPU;
trackCPU.Maximum = AsusACPI.MaxCPU;
trackCPU.Minimum = AsusACPI.MinCPU;
trackCPU.Scroll += TrackPower_Scroll;
trackTotal.Scroll += TrackPower_Scroll;
@@ -83,11 +98,11 @@ namespace GHelper
trackGPUMemory.Minimum = NvidiaGpuControl.MinMemoryOffset;
trackGPUMemory.Maximum = NvidiaGpuControl.MaxMemoryOffset;
trackGPUBoost.Minimum = ASUSWmi.MinGPUBoost;
trackGPUBoost.Maximum = ASUSWmi.MaxGPUBoost;
trackGPUBoost.Minimum = AsusACPI.MinGPUBoost;
trackGPUBoost.Maximum = AsusACPI.MaxGPUBoost;
trackGPUTemp.Minimum = ASUSWmi.MinGPUTemp;
trackGPUTemp.Maximum = ASUSWmi.MaxGPUTemp;
trackGPUTemp.Minimum = AsusACPI.MinGPUTemp;
trackGPUTemp.Maximum = AsusACPI.MaxGPUTemp;
trackGPUCore.Scroll += trackGPU_Scroll;
trackGPUMemory.Scroll += trackGPU_Scroll;
@@ -107,7 +122,7 @@ namespace GHelper
InitFans();
InitPower();
InitBoost();
InitGPU();
InitGPU(true);
comboBoost.SelectedValueChanged += ComboBoost_Changed;
@@ -119,10 +134,11 @@ namespace GHelper
private void TrackGPU_MouseUp(object? sender, MouseEventArgs e)
{
Program.settingsForm.AutoGPUSettings(true);
Program.settingsForm.SetGPUPower();
Program.settingsForm.SetGPUClocks(true);
}
public void InitGPU()
public void InitGPU(bool readClocks = false)
{
if (HardwareControl.GpuControl is not null && HardwareControl.GpuControl.IsNvidia)
{
@@ -130,31 +146,53 @@ namespace GHelper
}
else
{
panelGPU.Visible = false;
gpuVisible = panelGPU.Visible = false;
return;
}
try
{
panelGPU.Visible = true;
gpuVisible = panelGPU.Visible = true;
nvControl.GetClocks(out int core, out int memory, out string gpuTitle);
int gpu_boost = AppConfig.getConfigPerf("gpu_boost");
int gpu_temp = AppConfig.getConfigPerf("gpu_temp");
int core = AppConfig.getConfigPerf("gpu_core");
int memory = AppConfig.getConfigPerf("gpu_memory");
if (gpu_boost < 0) gpu_boost = AsusACPI.MaxGPUBoost;
if (gpu_temp < 0) gpu_temp = AsusACPI.MaxGPUTemp;
if (core == -1) core = 0;
if (memory == -1) memory = 0;
//if (readClocks)
//{
int status = nvControl.GetClocks(out int current_core, out int current_memory);
if (status != -1)
{
core = current_core;
memory = current_memory;
}
try
{
labelGPU.Text = nvControl.FullName;
}
catch
{
}
//}
trackGPUCore.Value = Math.Max(Math.Min(core, NvidiaGpuControl.MaxCoreOffset), NvidiaGpuControl.MinCoreOffset);
trackGPUMemory.Value = Math.Max(Math.Min(memory, NvidiaGpuControl.MaxMemoryOffset), NvidiaGpuControl.MinMemoryOffset);
labelGPU.Text = gpuTitle;
int gpu_boost = Program.config.getConfigPerf("gpu_boost");
int gpu_temp = Program.config.getConfigPerf("gpu_temp");
trackGPUBoost.Value = Math.Max(Math.Min(gpu_boost, AsusACPI.MaxGPUBoost), AsusACPI.MinGPUBoost);
trackGPUTemp.Value = Math.Max(Math.Min(gpu_temp, AsusACPI.MaxGPUTemp), AsusACPI.MinGPUTemp);
if (gpu_boost < 0) gpu_boost = ASUSWmi.MaxGPUBoost;
if (gpu_temp < 0) gpu_temp = ASUSWmi.MaxGPUTemp;
trackGPUBoost.Value = Math.Max(Math.Min(gpu_boost, ASUSWmi.MaxGPUBoost), ASUSWmi.MinGPUBoost);
trackGPUTemp.Value = Math.Max(Math.Min(gpu_temp, ASUSWmi.MaxGPUTemp), ASUSWmi.MinGPUTemp);
panelGPUBoost.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_GPUC0) >= 0);
panelGPUTemp.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_GPUC2) >= 0);
panelGPUBoost.Visible = (Program.acpi.DeviceGet(AsusACPI.PPT_GPUC0) >= 0);
panelGPUTemp.Visible = (Program.acpi.DeviceGet(AsusACPI.PPT_GPUC2) >= 0);
VisualiseGPUSettings();
@@ -162,7 +200,7 @@ namespace GHelper
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
panelGPU.Visible = false;
gpuVisible = panelGPU.Visible = false;
}
}
@@ -181,8 +219,8 @@ namespace GHelper
TrackBar track = (TrackBar)sender;
track.Value = (int)Math.Round((float)track.Value / 5) * 5;
Program.config.setConfigPerf("gpu_core", trackGPUCore.Value);
Program.config.setConfigPerf("gpu_memory", trackGPUMemory.Value);
AppConfig.setConfigPerf("gpu_core", trackGPUCore.Value);
AppConfig.setConfigPerf("gpu_memory", trackGPUMemory.Value);
VisualiseGPUSettings();
@@ -190,8 +228,8 @@ namespace GHelper
private void trackGPUPower_Scroll(object? sender, EventArgs e)
{
Program.config.setConfigPerf("gpu_boost", trackGPUBoost.Value);
Program.config.setConfigPerf("gpu_temp", trackGPUTemp.Value);
AppConfig.setConfigPerf("gpu_boost", trackGPUBoost.Value);
AppConfig.setConfigPerf("gpu_temp", trackGPUTemp.Value);
VisualiseGPUSettings();
}
@@ -203,17 +241,26 @@ namespace GHelper
return (200 * Math.Round((float)(MinRPM * 100 + (MaxRPM - MinRPM) * percentage) / 200)).ToString() + unit;
}
void SetChart(Chart chart, int device)
void SetChart(Chart chart, AsusFan device)
{
string title;
string title = "";
if (device == 1)
title = Properties.Strings.FanProfileGPU;
else if (device == 2)
title = Properties.Strings.FanProfileMid;
else
title = Properties.Strings.FanProfileCPU;
switch (device)
{
case AsusFan.CPU:
title = Properties.Strings.FanProfileCPU;
break;
case AsusFan.GPU:
title = Properties.Strings.FanProfileGPU;
break;
case AsusFan.Mid:
title = Properties.Strings.FanProfileMid;
break;
case AsusFan.XGM:
title = "XG Mobile";
break;
}
if (Program.settingsForm.perfName.Length > 0)
labelFans.Text = Properties.Strings.FanProfiles + ": " + Program.settingsForm.perfName;
@@ -225,7 +272,7 @@ namespace GHelper
chart.ChartAreas[0].AxisX.Interval = 10;
chart.ChartAreas[0].AxisY.Minimum = 0;
chart.ChartAreas[0].AxisY.Maximum = 100;
chart.ChartAreas[0].AxisY.Maximum = fansMax;
chart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Arial", 7F);
@@ -234,10 +281,10 @@ namespace GHelper
chart.ChartAreas[0].AxisX.LineColor = chartGrid;
chart.ChartAreas[0].AxisY.LineColor = chartGrid;
for (int i = 0; i <= 90; i += 10)
for (int i = 0; i <= fansMax - 10; i += 10)
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartPercToRPM(i));
chart.ChartAreas[0].AxisY.CustomLabels.Add(98, 102, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.CustomLabels.Add(fansMax - 2, fansMax + 2, Properties.Strings.RPM);
chart.ChartAreas[0].AxisY.Interval = 10;
@@ -246,8 +293,10 @@ namespace GHelper
}
private void Fans_Shown(object? sender, EventArgs e)
public void FormPosition()
{
panelSliders.Visible = gpuVisible || powerVisible;
if (Height > Program.settingsForm.Height)
{
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
@@ -259,10 +308,14 @@ namespace GHelper
Top = Program.settingsForm.Top;
}
Left = Program.settingsForm.Left - Width - 5;
}
private void Fans_Shown(object? sender, EventArgs e)
{
FormPosition();
}
private void TrackPower_MouseUp(object? sender, MouseEventArgs e)
{
@@ -279,10 +332,10 @@ namespace GHelper
private void ComboBoost_Changed(object? sender, EventArgs e)
{
if (Program.config.getConfigPerf("auto_boost") != comboBoost.SelectedIndex)
if (AppConfig.getConfigPerf("auto_boost") != comboBoost.SelectedIndex)
{
NativeMethods.SetCPUBoost(comboBoost.SelectedIndex);
Program.config.setConfigPerf("auto_boost", comboBoost.SelectedIndex);
AppConfig.setConfigPerf("auto_boost", comboBoost.SelectedIndex);
}
}
@@ -290,7 +343,7 @@ namespace GHelper
{
if (sender is null) return;
CheckBox chk = (CheckBox)sender;
Program.config.setConfigPerf("auto_apply_power", chk.Checked ? 1 : 0);
AppConfig.setConfigPerf("auto_apply_power", chk.Checked ? 1 : 0);
if (chk.Checked)
{
@@ -298,7 +351,7 @@ namespace GHelper
}
else
{
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.getConfig("performance_mode"), "PerfMode");
Program.settingsForm.AutoFans();
}
@@ -309,7 +362,7 @@ namespace GHelper
if (sender is null) return;
CheckBox chk = (CheckBox)sender;
Program.config.setConfigPerf("auto_apply", chk.Checked ? 1 : 0);
AppConfig.setConfigPerf("auto_apply", chk.Checked ? 1 : 0);
if (chk.Checked)
{
@@ -317,7 +370,7 @@ namespace GHelper
}
else
{
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.getConfig("performance_mode"), "PerfMode");
Program.settingsForm.AutoPower();
}
}
@@ -344,10 +397,10 @@ namespace GHelper
public void InitPower(bool changed = false)
{
bool cpuBmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0); // 2022 model +
bool cpuAmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0); // 2021 model +
bool cpuBmode = (Program.acpi.DeviceGet(AsusACPI.PPT_CPUB0) >= 0); // 2022 model +
bool cpuAmode = (Program.acpi.DeviceGet(AsusACPI.PPT_TotalA0) >= 0); // 2021 model +
panelPower.Visible = cpuAmode;
powerVisible = panelPower.Visible = cpuAmode;
panelCPU.Visible = cpuBmode;
// Yes, that's stupid, but Total slider on 2021 model actually adjusts CPU PPT
@@ -358,7 +411,7 @@ namespace GHelper
int limit_total;
int limit_cpu;
bool apply = Program.config.getConfigPerf("auto_apply_power") == 1;
bool apply = AppConfig.getConfigPerf("auto_apply_power") == 1;
if (changed)
{
@@ -367,17 +420,17 @@ namespace GHelper
}
else
{
limit_total = Program.config.getConfigPerf("limit_total");
limit_cpu = Program.config.getConfigPerf("limit_cpu");
limit_total = AppConfig.getConfigPerf("limit_total");
limit_cpu = AppConfig.getConfigPerf("limit_cpu");
}
if (limit_total < 0) limit_total = ASUSWmi.DefaultTotal;
if (limit_total > ASUSWmi.MaxTotal) limit_total = ASUSWmi.MaxTotal;
if (limit_total < ASUSWmi.MinTotal) limit_total = ASUSWmi.MinTotal;
if (limit_total < 0) limit_total = AsusACPI.DefaultTotal;
if (limit_total > AsusACPI.MaxTotal) limit_total = AsusACPI.MaxTotal;
if (limit_total < AsusACPI.MinTotal) limit_total = AsusACPI.MinTotal;
if (limit_cpu < 0) limit_cpu = ASUSWmi.DefaultCPU;
if (limit_cpu > ASUSWmi.MaxCPU) limit_cpu = ASUSWmi.MaxCPU;
if (limit_cpu < ASUSWmi.MinCPU) limit_cpu = ASUSWmi.MinCPU;
if (limit_cpu < 0) limit_cpu = AsusACPI.DefaultCPU;
if (limit_cpu > AsusACPI.MaxCPU) limit_cpu = AsusACPI.MaxCPU;
if (limit_cpu < AsusACPI.MinCPU) limit_cpu = AsusACPI.MinCPU;
if (limit_cpu > limit_total) limit_cpu = limit_total;
trackTotal.Value = limit_total;
@@ -387,8 +440,8 @@ namespace GHelper
labelTotal.Text = trackTotal.Value.ToString() + "W";
labelCPU.Text = trackCPU.Value.ToString() + "W";
Program.config.setConfigPerf("limit_total", limit_total);
Program.config.setConfigPerf("limit_cpu", limit_cpu);
AppConfig.setConfigPerf("limit_total", limit_total);
AppConfig.setConfigPerf("limit_cpu", limit_cpu);
}
@@ -403,36 +456,52 @@ namespace GHelper
public void InitFans()
{
byte[] curve = Program.wmi.GetFanCurve(2);
int chartCount = 2;
if (curve.All(singleByte => singleByte == 0))
// Middle / system fan check
if (!AsusACPI.IsEmptyCurve(Program.acpi.GetFanCurve(AsusFan.Mid)))
{
Program.config.setConfig("mid_fan", 0);
AppConfig.setConfig("mid_fan", 1);
chartCount++;
chartMid.Visible = true;
SetChart(chartMid, AsusFan.Mid);
LoadProfile(seriesMid, AsusFan.Mid);
MinimumSize = new Size(0, chartCount * 400 + 200);
}
else
{
Program.config.setConfig("mid_fan", 1);
chartMid.Visible = true;
SetChart(chartMid, 2);
LoadProfile(seriesMid, 2);
AppConfig.setConfig("mid_fan", 0);
}
// XG Mobile Fan check
if (Program.acpi.IsXGConnected())
{
AppConfig.setConfig("xgm_fan", 1);
chartCount++;
chartXGM.Visible = true;
SetChart(chartXGM, AsusFan.XGM);
LoadProfile(seriesXGM, AsusFan.XGM);
MinimumSize = new Size(0, chartCount * 400 + 200);
}
else
{
AppConfig.setConfig("xgm_fan", 0);
}
SetChart(chartCPU, 0);
SetChart(chartGPU, 1);
SetChart(chartCPU, AsusFan.CPU);
SetChart(chartGPU, AsusFan.GPU);
LoadProfile(seriesCPU, 0);
LoadProfile(seriesGPU, 1);
LoadProfile(seriesCPU, AsusFan.CPU);
LoadProfile(seriesGPU, AsusFan.GPU);
int auto_apply = Program.config.getConfigPerf("auto_apply");
int auto_apply = AppConfig.getConfigPerf("auto_apply");
checkApplyFans.Checked = (auto_apply == 1);
}
void LoadProfile(Series series, int device, int def = 0)
void LoadProfile(Series series, AsusFan device, bool reset = false)
{
series.ChartType = SeriesChartType.Line;
@@ -441,14 +510,19 @@ namespace GHelper
series.Points.Clear();
int mode = Program.config.getConfig("performance_mode");
byte[] curve = Program.config.getFanConfig(device);
int mode = AppConfig.getConfig("performance_mode");
byte[] curve = AppConfig.getFanConfig(device);
if (def == 1 || curve.Length != 16)
curve = Program.wmi.GetFanCurve(device, mode);
if (reset || AsusACPI.IsInvalidCurve(curve))
{
curve = Program.acpi.GetFanCurve(device, mode);
if (curve.Length != 16 || curve.All(singleByte => singleByte == 0))
curve = Program.config.getDefaultCurve(device);
if (AsusACPI.IsInvalidCurve(curve))
curve = AppConfig.getDefaultCurve(device);
curve = AsusACPI.FixFanCurve(curve);
}
//Debug.WriteLine(BitConverter.ToString(curve));
@@ -464,7 +538,7 @@ namespace GHelper
}
void SaveProfile(Series series, int device)
void SaveProfile(Series series, AsusFan device)
{
byte[] curve = new byte[16];
int i = 0;
@@ -475,7 +549,7 @@ namespace GHelper
i++;
}
Program.config.setFanConfig(device, curve);
AppConfig.setFanConfig(device, curve);
//Program.wmi.SetFanCurve(device, curve);
}
@@ -484,25 +558,37 @@ namespace GHelper
private void ButtonReset_Click(object? sender, EventArgs e)
{
LoadProfile(seriesCPU, 0, 1);
LoadProfile(seriesGPU, 1, 1);
if (Program.config.getConfig("mid_fan") == 1)
LoadProfile(seriesMid, 2, 1);
LoadProfile(seriesCPU, AsusFan.CPU, true);
LoadProfile(seriesGPU, AsusFan.GPU, true);
if (AppConfig.isConfig("mid_fan"))
LoadProfile(seriesMid, AsusFan.Mid, true);
if (AppConfig.isConfig("xgm_fan"))
LoadProfile(seriesXGM, AsusFan.XGM, true);
checkApplyFans.Checked = false;
checkApplyPower.Checked = false;
Program.config.setConfigPerf("auto_apply", 0);
Program.config.setConfigPerf("auto_apply_power", 0);
AppConfig.setConfigPerf("auto_apply", 0);
AppConfig.setConfigPerf("auto_apply_power", 0);
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
Program.acpi.DeviceSet(AsusACPI.PerformanceMode, AppConfig.getConfig("performance_mode"), "PerfMode");
if (Program.acpi.IsXGConnected()) AsusUSB.ResetXGM();
trackGPUCore.Value = 0;
trackGPUMemory.Value = 0;
trackGPUBoost.Value = ASUSWmi.MaxGPUBoost;
trackGPUTemp.Value = ASUSWmi.MaxGPUTemp;
trackGPUBoost.Value = AsusACPI.MaxGPUBoost;
trackGPUTemp.Value = AsusACPI.MaxGPUTemp;
Program.settingsForm.AutoGPUSettings(true);
AppConfig.setConfigPerf("gpu_boost", trackGPUBoost.Value);
AppConfig.setConfigPerf("gpu_temp", trackGPUTemp.Value);
AppConfig.setConfigPerf("gpu_core", trackGPUCore.Value);
AppConfig.setConfigPerf("gpu_memory", trackGPUMemory.Value);
VisualiseGPUSettings();
Program.settingsForm.SetGPUClocks(true);
Program.settingsForm.SetGPUPower();
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
@@ -510,10 +596,14 @@ namespace GHelper
curPoint = null;
labelTip.Visible = false;
SaveProfile(seriesCPU, 0);
SaveProfile(seriesGPU, 1);
if (Program.config.getConfig("mid_fan") == 1)
SaveProfile(seriesMid, 2);
SaveProfile(seriesCPU, AsusFan.CPU);
SaveProfile(seriesGPU, AsusFan.GPU);
if (AppConfig.isConfig("mid_fan"))
SaveProfile(seriesMid, AsusFan.Mid);
if (AppConfig.isConfig("xgm_fan"))
SaveProfile(seriesXGM, AsusFan.XGM);
Program.settingsForm.AutoFans();
@@ -554,7 +644,7 @@ namespace GHelper
if (dx > 100) dx = 100;
if (dy < 0) dy = 0;
if (dy > 100) dy = 100;
if (dy > fansMax) dy = fansMax;
dymin = (dx - 65) * 1.2;

View File

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

View File

@@ -16,7 +16,7 @@
<PlatformTarget>AnyCPU</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
<AssemblyVersion>0.59</AssemblyVersion>
<AssemblyVersion>0.68</AssemblyVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@@ -59,8 +59,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="FftSharp" Version="2.0.0" />
<PackageReference Include="hidlibrary" Version="3.3.40" />
<PackageReference Include="HidSharpCore" Version="1.2.1.1" />
<PackageReference Include="NAudio" Version="2.1.0" />
<PackageReference Include="System.Management" Version="7.0.1" />
<PackageReference Include="TaskScheduler" Version="2.10.1" />
<PackageReference Include="WinForms.DataVisualization" Version="1.8.0" />

View File

@@ -11,7 +11,7 @@ public class AmdGpuControl : IGpuControl {
public bool IsNvidia => false;
public string FullName => _internalDiscreteAdapter!.AdapterName;
public AmdGpuControl() {
if (!Adl2.Load())
return;

View File

@@ -3,6 +3,7 @@
public interface IGpuControl : IDisposable {
bool IsNvidia { get; }
bool IsValid { get; }
public string FullName { get; }
int? GetCurrentTemperature();
int? GetGpuUse();
}

View File

@@ -1,9 +1,12 @@
using NvAPIWrapper.GPU;
using NvAPIWrapper.Native;
using NvAPIWrapper.Native.Delegates;
using NvAPIWrapper.Native.GPU;
using NvAPIWrapper.Native.GPU.Structures;
using NvAPIWrapper.Native.Interfaces.GPU;
using System;
using System.Diagnostics;
using System.Management;
using static NvAPIWrapper.Native.GPU.Structures.PerformanceStates20InfoV1;
namespace GHelper.Gpu;
@@ -28,6 +31,8 @@ public class NvidiaGpuControl : IGpuControl
public bool IsNvidia => IsValid;
public string FullName => _internalGpu!.FullName;
public int? GetCurrentTemperature()
{
if (!IsValid)
@@ -46,31 +51,89 @@ public class NvidiaGpuControl : IGpuControl
}
public void GetClocks(out int core, out int memory, out string gpu)
public int GetClocks(out int core, out int memory)
{
PhysicalGPU internalGpu = _internalGpu!;
gpu = internalGpu.FullName;
//Logger.WriteLine(internalGpu.FullName);
//Logger.WriteLine(internalGpu.ArchitectInformation.ToString());
Logger.WriteLine(internalGpu.FullName);
Logger.WriteLine(internalGpu.ArchitectInformation.ToString());
try
{
IPerformanceStates20Info states = GPUApi.GetPerformanceStates20(internalGpu.Handle);
core = states.Clocks[PerformanceStateId.P0_3DPerformance][0].FrequencyDeltaInkHz.DeltaValue / 1000;
memory = states.Clocks[PerformanceStateId.P0_3DPerformance][1].FrequencyDeltaInkHz.DeltaValue / 1000;
Logger.WriteLine($"GET GPU CLOCKS: {core}, {memory}");
return 0;
IPerformanceStates20Info states = GPUApi.GetPerformanceStates20(internalGpu.Handle);
} catch (Exception ex)
{
Logger.WriteLine("GET GPU CLOCKS:" + ex.Message);
core = memory = 0;
return -1;
}
//Logger.WriteLine("IPerformanceStates20Info type : " + states.GetType());
}
core = states.Clocks[PerformanceStateId.P0_3DPerformance][0].FrequencyDeltaInkHz.DeltaValue / 1000;
memory = states.Clocks[PerformanceStateId.P0_3DPerformance][1].FrequencyDeltaInkHz.DeltaValue / 1000;
private static void RunCMD(string name, string args)
{
var cmd = new Process();
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.FileName = name;
cmd.StartInfo.Arguments = args;
cmd.Start();
Logger.WriteLine(cmd.StandardOutput.ReadToEnd());
cmd.WaitForExit();
}
Logger.WriteLine($"GET GPU Clock offsets : {core}, {memory}");
public bool RestartGPUPnP()
{
if (!IsValid) return false;
try
{
PhysicalGPU internalGpu = _internalGpu!;
var pnpDeviceId = internalGpu.BusInformation.PCIIdentifiers.ToString();
Logger.WriteLine("Device ID:" + pnpDeviceId);
RunCMD("pnputil", $"/disable-device /deviceid \"{pnpDeviceId}\"");
Thread.Sleep(3000);
RunCMD("pnputil", $"/enable-device /deviceid \"{pnpDeviceId}\"");
Thread.Sleep(2000);
return true;
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
return false;
}
}
public bool RestartGPU()
{
try
{
string script = @"$device = Get-PnpDevice | Where-Object { $_.FriendlyName -imatch 'NVIDIA' -and $_.Class -eq 'Display' }; Disable-PnpDevice $device.InstanceId -Confirm:$false; Start-Sleep -Seconds 3; Enable-PnpDevice $device.InstanceId -Confirm:$false";
Logger.WriteLine(script);
RunCMD("powershell", script);
//Thread.Sleep(2000);
return true;
}
catch (Exception ex )
{
Logger.WriteLine(ex.ToString());
return false;
}
}
public int SetClocksFromConfig()
{
int core = Program.config.getConfig("gpu_core");
int memory = Program.config.getConfig("gpu_memory");
int core = AppConfig.getConfig("gpu_core");
int memory = AppConfig.getConfig("gpu_memory");
int status = SetClocks(core, memory);
return status;
}
@@ -86,7 +149,7 @@ public class NvidiaGpuControl : IGpuControl
var coreClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Graphics, new PerformanceStates20ParameterDelta(core * 1000));
var memoryClock = new PerformanceStates20ClockEntryV1(PublicClockDomain.Memory, new PerformanceStates20ParameterDelta(memory * 1000));
PerformanceStates20ClockEntryV1[] clocks = { coreClock , memoryClock};
PerformanceStates20ClockEntryV1[] clocks = { coreClock, memoryClock };
PerformanceStates20BaseVoltageEntryV1[] voltages = { };
PerformanceState20[] performanceStates = { new PerformanceState20(PerformanceStateId.P0_3DPerformance, clocks, voltages) };
@@ -95,12 +158,12 @@ public class NvidiaGpuControl : IGpuControl
try
{
Logger.WriteLine($"SET GPU CLOCKS: {core}, {memory}");
GPUApi.SetPerformanceStates20(internalGpu.Handle, overclock);
Logger.WriteLine($"SET GPU Clock offsets : {core}, {memory}");
}
catch (Exception ex)
{
Logger.WriteLine(ex.Message);
Logger.WriteLine("SET GPU CLOCKS: "+ex.Message);
return -1;
}

View File

@@ -19,14 +19,14 @@ public static class HardwareControl
public static int GetFanMax()
{
int max = 58;
if (Program.config.ContainsModel("401")) max = 72;
else if (Program.config.ContainsModel("503")) max = 68;
return Math.Max(max, Program.config.getConfig("fan_max"));
if (AppConfig.ContainsModel("401")) max = 72;
else if (AppConfig.ContainsModel("503")) max = 68;
return Math.Max(max, AppConfig.getConfig("fan_max"));
}
public static void SetFanMax(int fan)
{
Program.config.setConfig("fan_max", fan);
AppConfig.setConfig("fan_max", fan);
}
private static string FormatFan(int fan)
{
@@ -40,10 +40,10 @@ public static class HardwareControl
int fanMax = GetFanMax();
if (fan > fanMax && fan < 110) SetFanMax(fan);
if (Program.config.getConfig("fan_rpm") == 1)
return " Fan: " + (fan * 100).ToString() + "RPM";
if (AppConfig.getConfig("fan_rpm") == 1)
return GHelper.Properties.Strings.FanSpeed + (fan * 100).ToString() + "RPM";
else
return " Fan: " + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
return GHelper.Properties.Strings.FanSpeed + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
}
private static int GetGpuUse()
@@ -51,6 +51,7 @@ public static class HardwareControl
try
{
int? gpuUse = GpuControl?.GetGpuUse();
Logger.WriteLine("GPU usage: " + GpuControl?.FullName + " " + gpuUse + "%");
if (gpuUse is not null) return (int)gpuUse;
}
catch (Exception ex)
@@ -68,11 +69,11 @@ public static class HardwareControl
gpuTemp = -1;
gpuUse = -1;
cpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan));
gpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan));
midFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.Mid_Fan));
cpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.CPU_Fan));
gpuFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.GPU_Fan));
midFan = FormatFan(Program.acpi.DeviceGet(AsusACPI.Mid_Fan));
cpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_CPU);
cpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_CPU);
if (cpuTemp < 0) try
{
@@ -81,9 +82,9 @@ public static class HardwareControl
cpuTemp = ct.NextValue() - 273;
}
}
catch
catch (Exception ex)
{
Debug.WriteLine("Failed reading CPU temp");
Debug.WriteLine("Failed reading CPU temp :" + ex.Message);
}
try
@@ -94,12 +95,11 @@ public static class HardwareControl
catch (Exception ex)
{
gpuTemp = -1;
Debug.WriteLine("Failed reading GPU temp");
Debug.WriteLine(ex.ToString());
Debug.WriteLine("Failed reading GPU temp :" + ex.Message);
}
if (gpuTemp is null || gpuTemp < 0)
gpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_GPU);
gpuTemp = Program.acpi.DeviceGet(AsusACPI.Temp_GPU);
try
{
@@ -114,7 +114,7 @@ public static class HardwareControl
}
}
public static bool IsUsedGPU(int threshold = 20)
public static bool IsUsedGPU(int threshold = 10)
{
if (GetGpuUse() > threshold)
{
@@ -133,7 +133,7 @@ public static class HardwareControl
return null;
}
public static void RecreateGpuControlWithDelay(int delay = 3)
public static void RecreateGpuControlWithDelay(int delay = 5)
{
// Re-enabling the discrete GPU takes a bit of time,
// so a simple workaround is to refresh again after that happens

330
app/InputDispatcher.cs Normal file
View File

@@ -0,0 +1,330 @@
using HidLibrary;
using Microsoft.Win32;
using NAudio.CoreAudioApi;
using System.Diagnostics;
using System.Management;
using Tools;
namespace GHelper
{
public class KeyboardListener
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
public KeyboardListener(Action<int> KeyHandler)
{
HidDevice? input = AsusUSB.GetDevice();
if (input == null)
{
Logger.WriteLine("Input device not found");
return;
}
else
{
Logger.WriteLine("Listener 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
{
private static bool isOptimizationRunning = OptimizationService.IsRunning();
private static nint windowHandle;
public static Keys keyProfile = Keys.F5;
KeyboardListener listener;
KeyHandler m1, m2, togggle;
public InputDispatcher(nint handle)
{
windowHandle = handle;
Program.acpi.SubscribeToEvents(WatcherEventArrived);
// CTRL + SHIFT + F5 to cycle profiles
if (AppConfig.getConfig("keybind_profile") != -1) keyProfile = (Keys)AppConfig.getConfig("keybind_profile");
togggle = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, keyProfile, windowHandle);
m1 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeDown, windowHandle);
m2 = new KeyHandler(KeyHandler.NOMOD, Keys.VolumeUp, windowHandle);
RegisterKeys();
}
public void InitListener()
{
if (listener is not null) listener.Dispose();
if (!OptimizationService.IsRunning())
listener = new KeyboardListener(HandleEvent);
}
public void RegisterKeys()
{
string actionM1 = AppConfig.getConfigString("m1");
string actionM2 = AppConfig.getConfigString("m2");
togggle.Unregiser();
m1.Unregiser();
m2.Unregiser();
if (keyProfile != Keys.None)
{
togggle.Register();
}
if (actionM1 is not null && actionM1.Length > 0)
{
m1.Register();
}
if (actionM2 is not null && actionM2.Length > 0)
{
m2.Register();
}
}
static void CustomKey(string configKey = "m3")
{
string command = AppConfig.getConfigString(configKey + "_custom");
int intKey;
try
{
intKey = Convert.ToInt32(command, 16);
}
catch
{
intKey = -1;
}
if (intKey > 0)
NativeMethods.KeyPress(intKey);
else
LaunchProcess(command);
}
public static void KeyProcess(string name = "m3")
{
string action = AppConfig.getConfigString(name);
if (action is null || action.Length <= 1)
{
if (name == "m4")
action = "ghelper";
if (name == "fnf4")
action = "aura";
if (name == "fnf5")
action = "performance";
if (name == "m3" && !isOptimizationRunning)
action = "micmute";
}
switch (action)
{
case "mute":
NativeMethods.KeyPress(NativeMethods.VK_VOLUME_MUTE);
break;
case "play":
NativeMethods.KeyPress(NativeMethods.VK_MEDIA_PLAY_PAUSE);
break;
case "screenshot":
NativeMethods.KeyPress(NativeMethods.VK_SNAPSHOT);
break;
case "screen":
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
break;
case "miniled":
Program.settingsForm.BeginInvoke(Program.settingsForm.ToogleMiniled);
break;
case "aura":
Program.settingsForm.BeginInvoke(Program.settingsForm.CycleAuraMode);
break;
case "performance":
Program.settingsForm.BeginInvoke(Program.settingsForm.CyclePerformanceMode);
break;
case "ghelper":
Program.settingsForm.BeginInvoke(delegate
{
Program.SettingsToggle();
});
break;
case "custom":
CustomKey(name);
break;
case "micmute":
using (var enumerator = new MMDeviceEnumerator())
{
var commDevice = enumerator.GetDefaultAudioEndpoint(DataFlow.Capture, Role.Communications);
bool muteStatus = !commDevice.AudioEndpointVolume.Mute;
commDevice.AudioEndpointVolume.Mute = muteStatus;
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, muteStatus ? "Muted" : "Unmuted", muteStatus ? ToastIcon.MicrophoneMute : ToastIcon.Microphone);
}
break;
default:
break;
}
}
static bool GetTouchpadState()
{
using (var key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\PrecisionTouchPad\Status", false))
{
return (key?.GetValue("Enabled")?.ToString() == "1");
}
}
static void TabletMode()
{
bool touchpadState = GetTouchpadState();
bool tabletState = Program.acpi.DeviceGet(AsusACPI.TabletState) > 0;
Logger.WriteLine("Tablet: " + tabletState + " Touchpad: " + touchpadState);
if ((tabletState && touchpadState) || (!tabletState && !touchpadState)) AsusUSB.TouchpadToggle();
}
static void HandleEvent(int EventID)
{
switch (EventID)
{
case 124: // M3
KeyProcess("m3");
return;
case 56: // M4 / Rog button
KeyProcess("m4");
return;
case 174: // FN+F5
Program.settingsForm.BeginInvoke(Program.settingsForm.CyclePerformanceMode);
return;
case 179: // FN+F4
KeyProcess("fnf4");
return;
case 189: // Tablet mode
TabletMode();
return;
}
if (isOptimizationRunning) 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
backlight = Math.Max(0, backlight - 1);
AppConfig.setConfig("keyboard_brightness", backlight);
AsusUSB.ApplyBrightness(backlight);
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, backlightNames[backlight], ToastIcon.BacklightDown);
break;
case 196: // FN+F3
backlight = Math.Min(3, backlight + 1);
AppConfig.setConfig("keyboard_brightness", backlight);
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
Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x10, "Brightness");
break;
case 32: // FN+F8
Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x20, "Brightness");
break;
case 107: // FN+F10
bool touchpadState = GetTouchpadState();
if (!AsusUSB.TouchpadToggle()) Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x6B, "Touchpad");
Program.settingsForm.BeginInvoke(Program.settingsForm.RunToast, touchpadState ? "Off" : "On", ToastIcon.Touchpad);
break;
case 108: // FN+F11
Program.acpi.DeviceSet(AsusACPI.UniversalControl, 0x6c, "Sleep");
//NativeMethods.SetSuspendState(false, true, true);
break;
}
}
static void LaunchProcess(string command = "")
{
string executable = command.Split(' ')[0];
string arguments = command.Substring(executable.Length).Trim();
try
{
Process proc = Process.Start(executable, arguments);
}
catch
{
Logger.WriteLine("Failed to run " + command);
}
}
static void WatcherEventArrived(object sender, EventArrivedEventArgs e)
{
if (e.NewEvent is null) return;
int EventID = int.Parse(e.NewEvent["EventID"].ToString());
Logger.WriteLine("WMI event " + EventID);
HandleEvent(EventID);
}
}
}

View File

@@ -435,6 +435,10 @@ public class NativeMethods
}
[DllImport("Powrprof.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2;
@@ -647,12 +651,14 @@ public class NativeMethods
//Logger.WriteLine(screen.DeviceName);
count++;
}
if (displayNum > 0 && count == 0) laptopScreen = defaultDevice;
}
catch (Exception ex)
{
Logger.WriteLine(ex.ToString());
Logger.WriteLine("Can't detect internal screen");
//laptopScreen = Screen.PrimaryScreen.DeviceName;
laptopScreen = Screen.PrimaryScreen.DeviceName;
}
@@ -703,6 +709,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;
}
@@ -761,6 +768,7 @@ public class NativeMethods
{
PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme));
PowerSetActiveOverlayScheme(new Guid(scheme));
Logger.WriteLine(scheme);
}
public static void SetPowerScheme(int mode)

View File

@@ -4,7 +4,7 @@ using System.Runtime.InteropServices;
namespace OSD
{
class OSDNativeForm : NativeWindow, IDisposable
public class OSDNativeForm : NativeWindow, IDisposable
{
private bool _disposed = false;

View File

@@ -0,0 +1,44 @@
using System.Text.RegularExpressions;
using System.Text;
using System.Diagnostics;
namespace GHelper
{
public static class OptimizationService
{
public static void SetChargeLimit (int newValue)
{
// Set the path to the .ini file
string path = @"C:\ProgramData\ASUS\ASUS System Control Interface\ASUSOptimization\Customization.ini";
// Make a backup copy of the INI file
string backupPath = path + ".bak";
File.Copy(path, backupPath, true);
string fileContents = File.ReadAllText(path, Encoding.Unicode);
// Find the section [BatteryHealthCharging]
string sectionPattern = @"\[BatteryHealthCharging\]\s*(version=\d+)?\s+value=(\d+)";
Match sectionMatch = Regex.Match(fileContents, sectionPattern);
if (sectionMatch.Success)
{
// Replace the value with the new value
string oldValueString = sectionMatch.Groups[2].Value;
int oldValue = int.Parse(oldValueString);
string newSection = sectionMatch.Value.Replace($"value={oldValue}", $"value={newValue}");
// Replace the section in the file contents
fileContents = fileContents.Replace(sectionMatch.Value, newSection);
File.WriteAllText(path, fileContents, Encoding.Unicode);
}
}
public static bool IsRunning()
{
return (Process.GetProcessesByName("AsusOptimization").Count() > 0);
}
}
}

View File

@@ -1,11 +1,9 @@
using GHelper.Gpu;
using Microsoft.Win32;
using System.Diagnostics;
using System.Globalization;
using System.Management;
using System.Reflection;
using System.Security.Principal;
using Tools;
using static NativeMethods;
namespace GHelper
{
@@ -19,11 +17,9 @@ namespace GHelper
Visible = true
};
public static ASUSWmi? wmi;
public static AppConfig config = new AppConfig();
public static AsusACPI? acpi;
public static SettingsForm settingsForm = new SettingsForm();
public static ToastForm toast = new ToastForm();
public static IntPtr unRegPowerNotify;
@@ -31,6 +27,8 @@ namespace GHelper
private static long lastTheme;
private static long lastAdmin;
public static InputDispatcher inputDispatcher;
private static PowerLineStatus isPlugged = PowerLineStatus.Unknown;
// The main entry point for the application
@@ -40,16 +38,21 @@ 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("zh");
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();
try
{
wmi = new ASUSWmi();
acpi = new AsusACPI();
}
catch
{
@@ -64,7 +67,7 @@ namespace GHelper
}
Logger.WriteLine("------------");
Logger.WriteLine("App launched: " + config.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + (IsUserAdministrator()?"A":""));
Logger.WriteLine("App launched: " + AppConfig.GetModel() + " :" + Assembly.GetExecutingAssembly().GetName().Version.ToString() + CultureInfo.CurrentUICulture + (IsUserAdministrator() ? "." : ""));
Application.EnableVisualStyles();
@@ -74,12 +77,13 @@ namespace GHelper
trayIcon.MouseClick += TrayIcon_MouseClick;
wmi.SubscribeToEvents(WatcherEventArrived);
inputDispatcher = new InputDispatcher(ds);
settingsForm.InitAura();
settingsForm.InitMatrix();
settingsForm.SetStartupCheck(Startup.IsScheduled());
SetAutoModes();
// Subscribing for system power change events
@@ -87,18 +91,17 @@ namespace GHelper
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
// Subscribing for monitor power on events
var settingGuid = new NativeMethods.PowerSettingGuid();
PowerSettingGuid settingGuid = new NativeMethods.PowerSettingGuid();
unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(ds, settingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);
// CTRL + SHIFT + F5 to cycle profiles
var ghk = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, Keys.F5, ds);
ghk.Register();
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\') || action.Length > 0)
{
SettingsToggle(action);
}
Application.Run();
}
@@ -141,7 +144,9 @@ namespace GHelper
isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
Logger.WriteLine("AutoSetting for " + isPlugged.ToString());
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
inputDispatcher.InitListener();
settingsForm.SetBatteryChargeLimit(AppConfig.getConfig("charge_limit"));
settingsForm.AutoPerformance();
bool switched = settingsForm.AutoGPUMode();
@@ -153,7 +158,7 @@ namespace GHelper
}
settingsForm.AutoKeyboard();
settingsForm.SetMatrix();
settingsForm.matrix.SetMatrix();
}
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
@@ -165,125 +170,8 @@ namespace GHelper
}
static void LaunchProcess(string command = "")
{
string executable = command.Split(' ')[0];
string arguments = command.Substring(executable.Length).Trim();
try
{
Process proc = Process.Start(executable, arguments);
}
catch
{
Logger.WriteLine("Failed to run " + command);
}
}
static void CustomKey(string configKey = "m3")
{
string command = config.getConfigString(configKey + "_custom");
int intKey;
try
{
intKey = Convert.ToInt32(command, 16);
}
catch
{
intKey = -1;
}
if (intKey > 0)
NativeMethods.KeyPress(intKey);
else
LaunchProcess(command);
}
static void KeyProcess(string name = "m3")
{
string action = config.getConfigString(name);
if (action is null || action.Length <= 1)
{
if (name == "m4")
action = "ghelper";
if (name == "fnf4")
action = "aura";
}
switch (action)
{
case "mute":
NativeMethods.KeyPress(NativeMethods.VK_VOLUME_MUTE);
break;
case "play":
NativeMethods.KeyPress(NativeMethods.VK_MEDIA_PLAY_PAUSE);
break;
case "screenshot":
NativeMethods.KeyPress(NativeMethods.VK_SNAPSHOT);
break;
case "screen":
NativeMethods.TurnOffScreen(Program.settingsForm.Handle);
break;
case "miniled":
settingsForm.BeginInvoke(settingsForm.ToogleMiniled);
break;
case "aura":
settingsForm.BeginInvoke(settingsForm.CycleAuraMode);
break;
case "performance":
settingsForm.BeginInvoke(settingsForm.CyclePerformanceMode);
break;
case "ghelper":
settingsForm.BeginInvoke(delegate
{
SettingsToggle();
});
break;
case "custom":
CustomKey(name);
break;
default:
break;
}
}
static void WatcherEventArrived(object sender, EventArrivedEventArgs e)
{
var collection = (ManagementEventWatcher)sender;
if (e.NewEvent is null) return;
int EventID = int.Parse(e.NewEvent["EventID"].ToString());
Logger.WriteLine("WMI event " + EventID);
switch (EventID)
{
case 124: // M3
KeyProcess("m3");
return;
case 56: // M4 / Rog button
KeyProcess("m4");
return;
case 174: // FN+F5
settingsForm.BeginInvoke(settingsForm.CyclePerformanceMode);
return;
case 179: // FN+F4
KeyProcess("fnf4");
return;
}
}
static void SettingsToggle(string action = "")
public static void SettingsToggle(string action = "")
{
if (settingsForm.Visible)
settingsForm.Hide();
@@ -291,16 +179,19 @@ namespace GHelper
{
settingsForm.Show();
settingsForm.Activate();
settingsForm.VisualiseGPUMode();
if (action == "gpu")
switch (action)
{
Startup.ReScheduleAdmin();
settingsForm.FansToggle();
case "gpu":
Startup.ReScheduleAdmin();
settingsForm.FansToggle();
break;
case "gpurestart":
settingsForm.RestartGPU(false);
break;
}
}
settingsForm.VisualiseGPUMode();
}
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
@@ -368,7 +259,7 @@ namespace GHelper
startInfo.Arguments = param;
startInfo.Verb = "runas";
Process.Start(startInfo);
//Application.Exit();
Application.Exit();
}
}
}

View File

@@ -61,25 +61,55 @@ namespace GHelper.Properties {
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Icon eco {
internal static System.Drawing.Bitmap backlight_down {
get {
object obj = ResourceManager.GetObject("eco", resourceCulture);
return ((System.Drawing.Icon)(obj));
object obj = ResourceManager.GetObject("backlight_down", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap everything_is_fine_itsfine {
internal static System.Drawing.Bitmap backlight_up {
get {
object obj = ResourceManager.GetObject("everything-is-fine-itsfine", resourceCulture);
object obj = ResourceManager.GetObject("backlight_up", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap brightness_down {
get {
object obj = ResourceManager.GetObject("brightness_down", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap brightness_up {
get {
object obj = ResourceManager.GetObject("brightness_up", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
/// </summary>
internal static System.Drawing.Icon eco {
get {
object obj = ResourceManager.GetObject("eco", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -230,6 +260,26 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_microphone_96 {
get {
object obj = ResourceManager.GetObject("icons8_microphone_96", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_mute_unmute_96 {
get {
object obj = ResourceManager.GetObject("icons8_mute_unmute_96", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -330,6 +380,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_touchpad_96 {
get {
object obj = ResourceManager.GetObject("icons8_touchpad_96", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -133,9 +133,6 @@
<data name="icons8-fiat-500-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-fiat-500-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-project-management-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-project-management-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-bicycle-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-bicycle-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -205,13 +202,34 @@
<data name="icons8-speed-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-speed-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="everything-is-fine-itsfine" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\itsfine.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-help-64" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-help-64.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_video_48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-video-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-project-management-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-project-management-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_microphone_96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-microphone-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_touchpad_96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-touchpad-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="backlight_down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\backlight-down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="backlight_up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\backlight-up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="brightness_down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\brightness-down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="brightness_up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\brightness-up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8_mute_unmute_96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-mute-unmute-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -168,6 +168,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Auto adjust Windows Power Modes.
/// </summary>
internal static string ApplyWindowsPowerPlan {
get {
return ResourceManager.GetString("ApplyWindowsPowerPlan", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Breathe.
/// </summary>
@@ -267,6 +276,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Seconds to turn off backlight on battery.
/// </summary>
internal static string BacklightTimeout {
get {
return ResourceManager.GetString("BacklightTimeout", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Balanced.
/// </summary>
@@ -465,6 +483,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Fan: .
/// </summary>
internal static string FanSpeed {
get {
return ResourceManager.GetString("FanSpeed", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Fans + Power.
/// </summary>
@@ -474,6 +501,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Dynamic Boost.
/// </summary>
internal static string GPUBoost {
get {
return ResourceManager.GetString("GPUBoost", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Changing.
/// </summary>
@@ -483,6 +519,24 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Core Clock Offset.
/// </summary>
internal static string GPUCoreClockOffset {
get {
return ResourceManager.GetString("GPUCoreClockOffset", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Memory Clock Offset.
/// </summary>
internal static string GPUMemoryClockOffset {
get {
return ResourceManager.GetString("GPUMemoryClockOffset", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to GPU Mode.
/// </summary>
@@ -528,6 +582,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Temperature Target.
/// </summary>
internal static string GPUTempTarget {
get {
return ResourceManager.GetString("GPUTempTarget", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Key Bindings.
/// </summary>
@@ -609,6 +672,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Audio Visualizer.
/// </summary>
internal static string MatrixAudio {
get {
return ResourceManager.GetString("MatrixAudio", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Binary Banner.
/// </summary>
@@ -708,6 +780,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Mute Mic.
/// </summary>
internal static string MuteMic {
get {
return ResourceManager.GetString("MuteMic", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Open G-Helper window.
/// </summary>
@@ -825,6 +906,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Something is using dGPU and preventing Eco mode. Restart dGPU in device manager? * Please proceed on your own risk..
/// </summary>
internal static string RestartGPU {
get {
return ResourceManager.GetString("RestartGPU", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to RPM.
/// </summary>
@@ -978,6 +1068,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Volume Down.
/// </summary>
internal static string VolumeDown {
get {
return ResourceManager.GetString("VolumeDown", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Volume Mute.
/// </summary>
@@ -987,6 +1086,15 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized string similar to Volume Up.
/// </summary>
internal static string VolumeUp {
get {
return ResourceManager.GetString("VolumeUp", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Keep app window always on top.
/// </summary>

View File

@@ -59,106 +59,115 @@
<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>Can't connect to ASUS ACPI. Application can't function without it. Try to install Asus System Control Interface</value>
<value>Verbindung zu ASUS ACPI fehlgeschlagen. G-Helper kann nicht ausgeführt werden. Bitte installiere ASUS System Control Interface.</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Looks like GPU is in heavy use, disable it?</value>
<value>Die GPU wird gerade verwendet. Trotzdem deaktivieren?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Eco Mode</value>
<value>Eco Modus</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Switching off Ultimate Mode requires restart</value>
<value>Wechseln in den Ultimate Modus benötigt einen Neustart. Jetzt neustarten?</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Ultimate Mode requires restart</value>
<value>Ultimate Modus benötigt einen Neustart</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Reboot now?</value>
<value>Jetzt neustarten?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Animation Speed</value>
<value>Animationsgeschwindigkeit</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>Anime Matrix</value>
<value>AniMeMatrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>App already running</value>
<value>Die Anwendung läuft bereits</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper is already running. Check system tray for an icon.</value>
<value>G-Helper läuft bereits. Bitte prüfe den Systemtray.</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Apply Custom Fan Curve</value>
<value>Lüfterkurve anweden</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Apply Power Limits</value>
<value>Leistunsgrenzen anwenden</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Windows Leistungsmodus automatisch anpassen</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
<value>Atmen</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Color Cycle</value>
<value>Farbwechsel</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Fast</value>
<value>Schnell</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Rainbow</value>
<value>Regenbogen</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Slow</value>
<value>Langsam</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Static</value>
<value>Statisch</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Strobe</value>
<value>Stroboskop</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Auto</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Sets 60Hz to save battery, and back when plugged</value>
<value>60Hz im Batteriebetrieb Maximal wenn eingesteckt.</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Awake</value>
<value>Im Betrieb</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Tastaturbelechtung abschalten in (Sekunden)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balanced</value>
<value>Ausbalanciert</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Battery Charge Limit</value>
<value>Ladebegrenzung</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Boot</value>
<value>Hochfahren</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Helligkeit</value>
</data>
<data name="Color" xml:space="preserve">
<value>Color</value>
<value>Farbe</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Custom</value>
<value>Benutzerdefiniert</value>
</data>
<data name="Default" xml:space="preserve">
<value>Default</value>
<value>Standard</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Disable screen overdrive</value>
<value>Overdrive abschalten</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Discharging</value>
<value>Entlädt</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download Update</value>
<value>Updates herunterladen</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Disables dGPU for battery savings</value>
<value>dGPU zum Stromsparen abschalten</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Eco</value>
@@ -167,172 +176,193 @@
<value>Extra</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Extra Settings</value>
<value>Extra-Einstellungen</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Factory Defaults</value>
<value>Werkseinstellungen</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Fan Curves</value>
<value>Lüfterkurven</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>CPU Fan Profile</value>
<value>CPU Lüfterprofil</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>GPU Fan Profile</value>
<value>GPU Lüfterprofil</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Mid Fan Profile</value>
<value>Mittleres Lüfterprofil</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Fan Profiles</value>
<value>Lüfterprofile</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Fans and Power</value>
<value>Lüfter und Leistung</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value> Lüfter: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Fans + Power</value>
<value>Lüfter + Leistung</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Changing</value>
<value>Wechseln</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Kernfrequenz Anpassung</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Speicherfrequenz Anpassung</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>GPU Mode</value>
<value>GPU Modus</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>iGPU only</value>
<value>Nur iGPU</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>dGPU exclusive</value>
<value>Nur dGPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Maximale GPU Temperatur</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Key Bindings</value>
<value>Tastenbelegung</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Keyboard</value>
<value>Tastatur</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Lower backlight brightness on battery and back when plugged</value>
<value>Tastaturbeleuchtung im Batteriebetrieb abdunkeln.</value>
</data>
<data name="KeyboardBacklight" xml:space="preserve">
<value>Keyboard Backlight</value>
<value>Tastaturbeleuchtung</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Laptopbelechtung</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptop Keyboard</value>
<value>Laptoptastatur</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Laptop Screen</value>
<value>Laptopbildschirm</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Binary Banner</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Bright</value>
<value>Hell</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Clock</value>
<value>Uhr</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Dim</value>
<value>Dunkel</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Rog Logo</value>
<value>ROG Logo</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Medium</value>
<value>Mittel</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Off</value>
<value>Aus</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Picture</value>
<value>Bild</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Max refresh rate for lower latency</value>
<value>Maximale Wiederholrate für niedrigste Latenz</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>60Hz refresh rate to save battery</value>
<value>60Hz um Strom zu sparen</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizone</value>
<value>Multi-Zone</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Open G-Helper window</value>
<value>G-Helper Fenster öffnen</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Optimized</value>
<value>Optimiert</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Switch to Eco on battery and to Standard when plugged</value>
<value>Eco Modus im Batteriebetrieb, Standard wenn eingesteckt.</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>GPU beim USB-C Laden im Optimierten Modus deaktiviert lassen</value>
</data>
<data name="Other" xml:space="preserve">
<value>Other</value>
<value>Sonstiges</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Performance Mode</value>
<value>Leistungsmodus</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Picture / Gif</value>
<value>Bild / GIF</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Play / Pause</value>
<value>Wiedergabe / Pause</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Power Limits (PPT)</value>
<value>Leistungsbegrenzung (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Power Limits (PPT) is experimental feature. Use carefully and on your own risk!</value>
<value>Leistungsbegrenzung (PPT) ist experimentell. Nutzung erfolgt auf eigene Gefahr!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>PrintScreen</value>
<value>Druck</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Quit</value>
<value>Schließen</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
<value>U/Min</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Run on Startup</value>
<value>Beim Start ausführen</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Shutdown</value>
<value>Herunterfahren</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Silent</value>
<value>Leise</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Sleep</value>
<value>Standby</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Enables dGPU for standard use</value>
<value>dGPU aktivieren</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Standard</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Startup Error</value>
<value>Startfehler</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Toggle Aura</value>
<value>Aura umschalten</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Turned off</value>
<value>Ausgeschaltet</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Turn off on battery</value>
<value>Im Batteriebetrieb abschalten</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Routes laptop screen to dGPU, maximizing FPS</value>
<value>Verbindet den Bildschirm mit der dGPU für maximale Leistung.</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
@@ -341,9 +371,9 @@
<value>Version</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Volume Mute</value>
<value>Stummschalten</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Keep app window always on top</value>
<value>Fenster immer über allen anderen</value>
</data>
</root>

View File

@@ -153,6 +153,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Aplicar límites de energía</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto-ajustar plan de energía Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Respiración</value>
</data>
@@ -186,6 +189,9 @@
<data name="Awake" xml:space="preserve">
<value>Encendida</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Apagar retroiluminación con batería (segundos)</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
</data>
@@ -252,11 +258,23 @@
<data name="FansAndPower" xml:space="preserve">
<value>Ventiladores y energía</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value> Fan: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Ventiladores + Energía</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Cargando</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Core Clock Offset</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Memory Clock Offset</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Modo de GPU</value>
@@ -270,6 +288,12 @@
<data name="GPUModeUltimate" xml:space="preserve">
<value>Exclusivo dGPU</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Ajustes de GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Temperatura objetivo</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Atajos de teclado</value>
</data>
@@ -288,6 +312,18 @@
<data name="LaptopScreen" xml:space="preserve">
<value>Pantalla del portátil</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Tapa</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>Barra de luz</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Visualizador de audio</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Banner binario</value>
</data>
@@ -321,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>
@@ -360,6 +399,9 @@
<data name="Quit" xml:space="preserve">
<value>Quitar</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Algo está usando la dGPU e impide usar Modo Eco. ¿Reiniciar dGPU en administrador de dispositivos? * Proceda bajo su propio riesgo.</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
@@ -388,7 +430,7 @@
<value>Alternar Aura</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Alternar Miniled (si es compatible)</value>
<value>Alternar Miniled (si comp.)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Alternar pantalla</value>
@@ -411,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,291 +118,351 @@
<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>Can't connect to ASUS ACPI. Application can't function without it. Try to install 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>Looks like GPU is in heavy use, disable it?</value>
<value>Le GPU semble être surchargé, voulez vous le désactiver ?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Eco Mode</value>
<value>Mode Éco</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Switching off Ultimate Mode requires restart</value>
<value>Désactiver le Mode Ultime requiert un redémarrage</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Ultimate Mode requires restart</value>
<value>Activer le Mode Ultime requiert un redémarrage</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Reboot now?</value>
<value>Redémarrer maintenant ?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Animation Speed</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>App already running</value>
<value>L'application est déjà en cours d'exécution</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper is already running. Check system tray for an icon.</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>Apply Custom Fan Curve</value>
<value>Appliquer la courbe</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Apply Power Limits</value>
<value>Appliquer les limites</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Ajustement auto des modes de gestion alim. Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
<value>Pulsation</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Color Cycle</value>
<value>Cycle de couleur</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Fast</value>
<value>Rapide</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Rainbow</value>
<value>Arc-en-ciel</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Slow</value>
<value>Lent</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Static</value>
<value>Statique</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Strobe</value>
<value>Stroboscopique</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Auto</value>
<value>Automatique</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Sets 60Hz to save battery, and back when plugged</value>
<value>Limite à 60 Hz pour éco. batterie, valeur normale sur secteur</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Awake</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>Balanced</value>
<value>Équilibré</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Battery Charge Limit</value>
<value>Limite de charge </value>
</data>
<data name="Boot" xml:space="preserve">
<value>Boot</value>
<value>Au démarrage</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosité</value>
</data>
<data name="Color" xml:space="preserve">
<value>Color</value>
<value>Couleur</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Custom</value>
<value>Personnalisé</value>
</data>
<data name="Default" xml:space="preserve">
<value>Default</value>
<value>Par défaut</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Disable screen overdrive</value>
<value>Désactiver l'overdrive de l'écran</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Discharging</value>
<value>Taux décharge </value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Download Update</value>
<value>Télécharger la mise à jour</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Disables dGPU for battery savings</value>
<value>Désactive le dGPU pour préserver la batterie</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Eco</value>
<value>Éco</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Extra</value>
<value>+ d'options</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Extra Settings</value>
<value>Paramètres supplémentaires</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Factory Defaults</value>
<value>Paramètres d'usine</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Fan Curves</value>
<value>Courbes des ventilateurs</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>CPU Fan Profile</value>
<value>Profil du ventilateur CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>GPU Fan Profile</value>
<value>Profil du ventilateur GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Mid Fan Profile</value>
<value>Profil du ventilateur central</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Fan Profiles</value>
<value>Profil</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Fans and Power</value>
<value>Ventilateurs + Puissance</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Vent: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Fans + Power</value>
<value>Ventilateurs + Puissance</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Changing</value>
<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>GPU Mode</value>
<value>Mode GPU </value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>iGPU only</value>
<value>iGPU uniquement</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>dGPU exclusive</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>Key Bindings</value>
<value>Raccourcis clavier</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Keyboard</value>
<value>Clavier</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Lower backlight brightness on battery and back when plugged</value>
<value>Réduire rétroéclairage sur batterie et mode normal sur secteur</value>
</data>
<data name="KeyboardBacklight" xml:space="preserve">
<value>Keyboard Backlight</value>
<data name="LaptopBacklight" xml:space="preserve">
<value>Rétroéclairage de l'ordinateur</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Laptop Keyboard</value>
<value>Clavier de l'ordinateur</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Laptop Screen</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>Binary Banner</value>
<value>Bannière binaire</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Bright</value>
<value>Lumineux</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Clock</value>
<value>Horloge</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Dim</value>
<value>Faible</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Rog Logo</value>
<value>Logo ROG</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Medium</value>
<value>Moyen</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Off</value>
<value>Éteint</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Picture</value>
<value>Images</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Max refresh rate for lower latency</value>
<value>Rafraîchissement maximum, faible latence</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>60Hz refresh rate to save battery</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>Open G-Helper window</value>
<value>Ouvrir G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Optimized</value>
<value>Optimi</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Switch to Eco on battery and to Standard when plugged</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>Other</value>
<value>Autre</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Performance Mode</value>
<value>Mode Performance</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Picture / Gif</value>
<value>Image / Gif</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Play / Pause</value>
<value>Lecture / Pause</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Power Limits (PPT)</value>
<value>Limites de puissance (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Power Limits (PPT) is experimental feature. Use carefully and on your own risk!</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>PrintScreen</value>
<value>Capture d'écran</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Quit</value>
<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>Run on Startup</value>
<value>Exécuter au démarrage</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Shutdown</value>
<value>Arrêter</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Silent</value>
<value>Silencieux</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Sleep</value>
<value>Veille</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Enables dGPU for standard use</value>
<value>Active le dGPU pour une utilisation standard</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Standard</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Startup Error</value>
<value>Erreur au lancement</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Toggle 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>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Turned off</value>
<value>Éteint</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Turn off on battery</value>
<value>Éteindre sur batterie</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Routes laptop screen to dGPU, maximizing 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>Volume Mute</value>
<value>Mettre en sourdine</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Vol+</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Keep app window always on top</value>
<value>Maintenir la fenêtre au premier plan</value>
</data>
</root>

View File

@@ -94,6 +94,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Apply Power Limits</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto Adjust Windows Power Mode</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
</data>

View File

@@ -0,0 +1,350 @@
<root>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>1.3</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ACPIError" xml:space="preserve">
<value>Não foi possível conectar ao ASUS ACPI. O applicativo não pode funcionar sem isso. Tente instalar Asus System Controle Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<value>Parece que o GPU está em uso pesado.</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<value>Modo econômico</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<value>Passar ao Modo Final implica na reinicialização do sistema</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<value>Modo Ultimado necessita de reinicialização.</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<value>Reiniciar agora ?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<value>Velocidade da Animação</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<value>Anime Matrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<value>O applicativo já está em execução</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper já está em execução. Verifique a barra de sistema</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<value>Aplicar a curva de ventilador personalizada</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Aplicar as limitações de energia</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Automaticamente ajustar os Modos de Energia Windows</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Repiração</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<value>Ciclo de cores</value>
</data>
<data name="AuraFast" xml:space="preserve">
<value>Rápido</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<value>Normal</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<value>Arco-íris</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<value>Lento</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<value>Estático</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<value>Estroboscópio</value>
</data>
<data name="AutoMode" xml:space="preserve">
<value>Automático</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>Estabelece 60Hz para economizar energia</value>
</data>
<data name="Awake" xml:space="preserve">
<value>Acordado</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Números de segundos para desligar a luz de fundo</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Equilibrado</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<value>Limite de carga da bateria</value>
</data>
<data name="Boot" xml:space="preserve">
<value>Durante o lançamento</value>
</data>
<data name="Brightness" xml:space="preserve">
<value>Luminosidade</value>
</data>
<data name="Color" xml:space="preserve">
<value>Cor</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<value>CPU Boost</value>
</data>
<data name="Custom" xml:space="preserve">
<value>Personalizado</value>
</data>
<data name="Default" xml:space="preserve">
<value>Padrão</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<value>Desativar o overdrive da tela</value>
</data>
<data name="Discharging" xml:space="preserve">
<value>Descarregando</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<value>Baixar a atualização</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<value>Desativar o dGPU para economisar a energía</value>
</data>
<data name="EcoMode" xml:space="preserve">
<value>Econômico</value>
</data>
<data name="Extra" xml:space="preserve">
<value>Adicional</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<value>Configurações adicionais</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<value>Padrão de fábrica</value>
</data>
<data name="FanCurves" xml:space="preserve">
<value>Curvas de ventilador</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<value>Perfil de ventilador CPU</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<value>Perfil de ventilador GPU</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<value>Perfil de ventilador central</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<value>Perfis de ventilador</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<value>Ventiladores e Energía</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value>Ventilador</value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Ventiladores + Energía</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Boost dinâmico</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Carregando</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>Modo de GPU</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<value>Só iGPU</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<value>iGPU + dGPU</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<value>Exclusivamente dGPU</value>
</data>
<data name="GPUSettings" xml:space="preserve">
<value>Parâmetros de GPU</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Alvo de temperatura</value>
</data>
<data name="Keyboard" xml:space="preserve">
<value>Teclado</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<value>Abaixar a luz de fundo na bateria e voltar quando carregando</value>
</data>
<data name="KeyboardBacklight" xml:space="preserve">
<value>Luz de fundo do teclado</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<value>Luz de fundo do computador</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<value>Teclado do computador</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<value>Tela do computador</value>
</data>
<data name="Lid" xml:space="preserve">
<value>Tampa</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Bandeira Binária</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<value>Brilho</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<value>Relógio</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<value>Escuro</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<value>Logo ROG</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<value>Médio</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<value>Desligado</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<value>Imagem</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>Taxa de atualização maxíma para abaixar a latência</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<value>Taxa de atualização à 60Hz para salvar energía</value>
</data>
<data name="Multizone" xml:space="preserve">
<value>Multizona</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Abrir G-Helper</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>Otimizado</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>Passar ao Ecônomico em bateria e voltar quando carregando</value>
</data>
<data name="OptimizedUSBC" xml:space="preserve">
<value>Manter o GPU desligado com um carregador USB-C no Modo Otimizado</value>
</data>
<data name="Other" xml:space="preserve">
<value>Outro</value>
</data>
<data name="Overdrive" xml:space="preserve">
<value>Overdrive</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<value>Modo Desempenho</value>
</data>
<data name="PictureGif" xml:space="preserve">
<value>Imagem / Gif</value>
</data>
<data name="PlayPause" xml:space="preserve">
<value>Reproduzir / Pausar</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<value>Limitações de Energia (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<value>Limitações de Energia (PPT) é uma funcionalidade experimental. Usar isso com cuidado </value>
</data>
<data name="PrintScreen" xml:space="preserve">
<value>Captura de tela</value>
</data>
<data name="Quit" xml:space="preserve">
<value>Sair</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Aumento da frequência básica</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Aumento da frequência da memória</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Combinações de teclas</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Algum processo está usando o dGPU e impedindo o modo Econômico. Reinicialize o dGPU no gerenciador de dispositivos. Por favor, proceda por sua conta e risco. </value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<value>Executar ao iniciar</value>
</data>
<data name="Shutdown" xml:space="preserve">
<value>Desligar</value>
</data>
<data name="Silent" xml:space="preserve">
<value>Silencioso</value>
</data>
<data name="Sleep" xml:space="preserve">
<value>Hibernação</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<value>Liga o dGPU para uso padrão</value>
</data>
<data name="StandardMode" xml:space="preserve">
<value>Padrão</value>
</data>
<data name="StartupError" xml:space="preserve">
<value>Erro ao iniciar</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<value>Alternar Aura</value>
</data>
<data name="ToggleMiniled" xml:space="preserve">
<value>Alternar Miniled (se suportado) </value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>Alternar Tela</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>Turbo</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<value>Desligado</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<value>Desligar em bateria</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>Direciona a tela do computador ao dGPU</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<value>Ultimate</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<value>Versão</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Mudo</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Manter o app em primeiro plano</value>
</data>
</root>

View File

@@ -153,6 +153,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Apply Power Limits</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto adjust Windows Power Modes</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Breathe</value>
</data>
@@ -186,6 +189,9 @@
<data name="Awake" xml:space="preserve">
<value>Awake</value>
</data>
<data name="BacklightTimeout" xml:space="preserve">
<value>Seconds to turn off backlight on battery</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>Balanced</value>
</data>
@@ -252,12 +258,24 @@
<data name="FansAndPower" xml:space="preserve">
<value>Fans and Power</value>
</data>
<data name="FanSpeed" xml:space="preserve">
<value> Fan: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>Fans + Power</value>
</data>
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>Changing</value>
</data>
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>Core Clock Offset</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>Memory Clock Offset</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>GPU Mode</value>
</data>
@@ -273,6 +291,9 @@
<data name="GPUSettings" xml:space="preserve">
<value>GPU Settings</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>Temperature Target</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>Key Bindings</value>
</data>
@@ -300,6 +321,9 @@
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Audio Visualizer</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>Binary Banner</value>
</data>
@@ -333,6 +357,9 @@
<data name="Multizone" xml:space="preserve">
<value>Multizone</value>
</data>
<data name="MuteMic" xml:space="preserve">
<value>Mute Mic</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>Open G-Helper window</value>
</data>
@@ -372,6 +399,9 @@
<data name="Quit" xml:space="preserve">
<value>Quit</value>
</data>
<data name="RestartGPU" xml:space="preserve">
<value>Something is using dGPU and preventing Eco mode. Restart dGPU in device manager? * Please proceed on your own risk.</value>
</data>
<data name="RPM" xml:space="preserve">
<value>RPM</value>
</data>
@@ -423,9 +453,15 @@
<data name="VersionLabel" xml:space="preserve">
<value>Version</value>
</data>
<data name="VolumeDown" xml:space="preserve">
<value>Volume Down</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<value>Volume Mute</value>
</data>
<data name="VolumeUp" xml:space="preserve">
<value>Volume Up</value>
</data>
<data name="WindowTop" xml:space="preserve">
<value>Keep app window always on top</value>
</data>

View File

@@ -153,6 +153,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Güç Sınırlarını Uygula</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Auto adjust Windows Power Mode</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Nefes</value>
</data>

View File

@@ -153,6 +153,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>Застосувати потужність</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>Автоматично застосовувати Windows Power Modes</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>Дихання</value>
</data>

View File

@@ -153,6 +153,9 @@
<data name="ApplyPowerLimits" xml:space="preserve">
<value>应用功率限制</value>
</data>
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>自动调整Windows电源模式</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>呼吸</value>
</data>
@@ -408,4 +411,4 @@
<data name="WindowTop" xml:space="preserve">
<value>窗口置顶</value>
</data>
</root>
</root>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
<!--
Microsoft ResX Schema
Version 2.0
@@ -59,353 +59,404 @@
: 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">
<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>無法連結到華碩 ACPI。 没有它,應用程式將無法執行。 嘗試安裝Asus System Control Interface</value>
</data>
<data name="AlertDGPU" xml:space="preserve">
<data name="AlertDGPU" xml:space="preserve">
<value>看起来 GPU 正在大量使用,是否禁用它?</value>
</data>
<data name="AlertDGPUTitle" xml:space="preserve">
<data name="AlertDGPUTitle" xml:space="preserve">
<value>節能模式</value>
</data>
<data name="AlertUltimateOff" xml:space="preserve">
<data name="AlertUltimateOff" xml:space="preserve">
<value>關閉獨顯需要重新啟動</value>
</data>
<data name="AlertUltimateOn" xml:space="preserve">
<data name="AlertUltimateOn" xml:space="preserve">
<value>獨顯直連需要重啟</value>
</data>
<data name="AlertUltimateTitle" xml:space="preserve">
<data name="AlertUltimateTitle" xml:space="preserve">
<value>現在重新啟動嗎?</value>
</data>
<data name="AnimationSpeed" xml:space="preserve">
<data name="AnimationSpeed" xml:space="preserve">
<value>動畫速度</value>
</data>
<data name="AnimeMatrix" xml:space="preserve">
<data name="AnimeMatrix" xml:space="preserve">
<value>AnimeMatrix</value>
</data>
<data name="AppAlreadyRunning" xml:space="preserve">
<data name="AppAlreadyRunning" xml:space="preserve">
<value>程式已正在執行</value>
</data>
<data name="AppAlreadyRunningText" xml:space="preserve">
<data name="AppAlreadyRunningText" xml:space="preserve">
<value>G-Helper已經在執行。 請確認右下工作列中的圖示。</value>
</data>
<data name="ApplyFanCurve" xml:space="preserve">
<data name="ApplyFanCurve" xml:space="preserve">
<value>套用自定義風扇曲線</value>
</data>
<data name="ApplyPowerLimits" xml:space="preserve">
<data name="ApplyPowerLimits" xml:space="preserve">
<value>套用功率限制</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<data name="ApplyWindowsPowerPlan" xml:space="preserve">
<value>自動調整Windows電源模式</value>
</data>
<data name="AuraBreathe" xml:space="preserve">
<value>呼吸</value>
</data>
<data name="AuraColorCycle" xml:space="preserve">
<data name="AuraColorCycle" xml:space="preserve">
<value>循環</value>
</data>
<data name="AuraFast" xml:space="preserve">
<data name="AuraFast" xml:space="preserve">
<value>快速</value>
</data>
<data name="AuraNormal" xml:space="preserve">
<data name="AuraNormal" xml:space="preserve">
<value>正常</value>
</data>
<data name="AuraRainbow" xml:space="preserve">
<data name="AuraRainbow" xml:space="preserve">
<value>彩虹</value>
</data>
<data name="AuraSlow" xml:space="preserve">
<data name="AuraSlow" xml:space="preserve">
<value>慢</value>
</data>
<data name="AuraStatic" xml:space="preserve">
<data name="AuraStatic" xml:space="preserve">
<value>靜態</value>
</data>
<data name="AuraStrobe" xml:space="preserve">
<data name="AuraStrobe" xml:space="preserve">
<value>閃爍</value>
</data>
<data name="AutoMode" xml:space="preserve">
<data name="AutoMode" xml:space="preserve">
<value>自動</value>
</data>
<data name="AutoRefreshTooltip" xml:space="preserve">
<data name="AutoRefreshTooltip" xml:space="preserve">
<value>電池模式時自動60Hz</value>
</data>
<data name="Awake" xml:space="preserve">
<data name="Awake" xml:space="preserve">
<value>喚醒時</value>
</data>
<data name="Balanced" xml:space="preserve">
<data name="BacklightTimeout" xml:space="preserve">
<value>電池模式下自動關閉背光的秒數</value>
</data>
<data name="Balanced" xml:space="preserve">
<value>平衡模式</value>
</data>
<data name="BatteryChargeLimit" xml:space="preserve">
<data name="BatteryChargeLimit" xml:space="preserve">
<value>電池充電上限</value>
</data>
<data name="Boot" xml:space="preserve">
<data name="Boot" xml:space="preserve">
<value>開機時</value>
</data>
<data name="Brightness" xml:space="preserve">
<data name="Brightness" xml:space="preserve">
<value>亮度</value>
</data>
<data name="Color" xml:space="preserve">
<data name="Color" xml:space="preserve">
<value>顏色</value>
</data>
<data name="CPUBoost" xml:space="preserve">
<data name="CPUBoost" xml:space="preserve">
<value>CPU 加速</value>
</data>
<data name="Custom" xml:space="preserve">
<data name="Custom" xml:space="preserve">
<value>自定義設置</value>
</data>
<data name="Default" xml:space="preserve">
<data name="Default" xml:space="preserve">
<value>預設</value>
</data>
<data name="DisableOverdrive" xml:space="preserve">
<data name="DisableOverdrive" xml:space="preserve">
<value>禁用螢幕加速OD</value>
</data>
<data name="Discharging" xml:space="preserve">
<data name="Discharging" xml:space="preserve">
<value>正在釋放電力</value>
</data>
<data name="DownloadUpdate" xml:space="preserve">
<data name="DownloadUpdate" xml:space="preserve">
<value>下載更新</value>
</data>
<data name="EcoGPUTooltip" xml:space="preserve">
<data name="EcoGPUTooltip" xml:space="preserve">
<value>禁用獨顯以節省電池電量</value>
</data>
<data name="EcoMode" xml:space="preserve">
<data name="EcoMode" xml:space="preserve">
<value>節能模式</value>
</data>
<data name="Extra" xml:space="preserve">
<data name="Extra" xml:space="preserve">
<value>更多</value>
</data>
<data name="ExtraSettings" xml:space="preserve">
<data name="ExtraSettings" xml:space="preserve">
<value>更多設定</value>
</data>
<data name="FactoryDefaults" xml:space="preserve">
<data name="FactoryDefaults" xml:space="preserve">
<value>恢復原廠設定</value>
</data>
<data name="FanCurves" xml:space="preserve">
<data name="FanCurves" xml:space="preserve">
<value>風扇曲線</value>
</data>
<data name="FanProfileCPU" xml:space="preserve">
<data name="FanProfileCPU" xml:space="preserve">
<value>CPU 風扇設置文件</value>
</data>
<data name="FanProfileGPU" xml:space="preserve">
<data name="FanProfileGPU" xml:space="preserve">
<value>GPU 風扇設置文件</value>
</data>
<data name="FanProfileMid" xml:space="preserve">
<data name="FanProfileMid" xml:space="preserve">
<value>中等風扇設置</value>
</data>
<data name="FanProfiles" xml:space="preserve">
<data name="FanProfiles" xml:space="preserve">
<value>風扇設置</value>
</data>
<data name="FansAndPower" xml:space="preserve">
<data name="FansAndPower" xml:space="preserve">
<value>風扇和電源</value>
</data>
<data name="FansPower" xml:space="preserve">
<data name="FanSpeed" xml:space="preserve">
<value> 風扇: </value>
</data>
<data name="FansPower" xml:space="preserve">
<value>自定義設置</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<data name="GPUBoost" xml:space="preserve">
<value>Dynamic Boost</value>
</data>
<data name="GPUChanging" xml:space="preserve">
<value>切換中...</value>
</data>
<data name="GPUMode" xml:space="preserve">
<data name="GPUCoreClockOffset" xml:space="preserve">
<value>核心時脈偏移量(Offset)</value>
</data>
<data name="GPUMemoryClockOffset" xml:space="preserve">
<value>顯示卡記憶體偏移量(Offset)</value>
</data>
<data name="GPUMode" xml:space="preserve">
<value>GPU 模式</value>
</data>
<data name="GPUModeEco" xml:space="preserve">
<data name="GPUModeEco" xml:space="preserve">
<value>僅限內顯</value>
</data>
<data name="GPUModeStandard" xml:space="preserve">
<data name="GPUModeStandard" xml:space="preserve">
<value>內顯 + 獨顯</value>
</data>
<data name="GPUModeUltimate" xml:space="preserve">
<data name="GPUModeUltimate" xml:space="preserve">
<value>獨立顯卡</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<data name="GPUSettings" xml:space="preserve">
<value>顯卡設定</value>
</data>
<data name="GPUTempTarget" xml:space="preserve">
<value>GPU溫度上限</value>
</data>
<data name="KeyBindings" xml:space="preserve">
<value>按鍵綁定</value>
</data>
<data name="Keyboard" xml:space="preserve">
<data name="Keyboard" xml:space="preserve">
<value>鍵盤</value>
</data>
<data name="KeyboardAuto" xml:space="preserve">
<data name="KeyboardAuto" xml:space="preserve">
<value>電池模式時自動降低鍵盤背光亮度以省電</value>
</data>
<data name="LaptopBacklight" xml:space="preserve">
<data name="LaptopBacklight" xml:space="preserve">
<value>背光</value>
</data>
<data name="LaptopKeyboard" xml:space="preserve">
<data name="LaptopKeyboard" xml:space="preserve">
<value>鍵盤背光:</value>
</data>
<data name="LaptopScreen" xml:space="preserve">
<data name="LaptopScreen" xml:space="preserve">
<value>螢幕顯示</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<data name="Lid" xml:space="preserve">
<value>螢幕背蓋</value>
</data>
<data name="Lightbar" xml:space="preserve">
<value>燈條</value>
</data>
<data name="Logo" xml:space="preserve">
<value>Logo</value>
</data>
<data name="MatrixAudio" xml:space="preserve">
<value>Audio Visualizer</value>
</data>
<data name="MatrixBanner" xml:space="preserve">
<value>横幅</value>
</data>
<data name="MatrixBright" xml:space="preserve">
<data name="MatrixBright" xml:space="preserve">
<value>明亮</value>
</data>
<data name="MatrixClock" xml:space="preserve">
<data name="MatrixClock" xml:space="preserve">
<value>時鐘</value>
</data>
<data name="MatrixDim" xml:space="preserve">
<data name="MatrixDim" xml:space="preserve">
<value>黯淡</value>
</data>
<data name="MatrixLogo" xml:space="preserve">
<data name="MatrixLogo" xml:space="preserve">
<value>ROG logo</value>
</data>
<data name="MatrixMedium" xml:space="preserve">
<data name="MatrixMedium" xml:space="preserve">
<value>中</value>
</data>
<data name="MatrixOff" xml:space="preserve">
<data name="MatrixOff" xml:space="preserve">
<value>關閉</value>
</data>
<data name="MatrixPicture" xml:space="preserve">
<data name="MatrixPicture" xml:space="preserve">
<value>圖片</value>
</data>
<data name="MaxRefreshTooltip" xml:space="preserve">
<data name="MaxRefreshTooltip" xml:space="preserve">
<value>更高的更新率和更低延遲</value>
</data>
<data name="MinRefreshTooltip" xml:space="preserve">
<data name="MinRefreshTooltip" xml:space="preserve">
<value>維持60Hz以節省電量</value>
</data>
<data name="Multizone" xml:space="preserve">
<data name="Multizone" xml:space="preserve">
<value>多區域</value>
</data>
<data name="OpenGHelper" xml:space="preserve">
<value>打開G-Helper視窗</value>
<data name="MuteMic" xml:space="preserve">
<value>麥克風開關</value>
</data>
<data name="Optimized" xml:space="preserve">
<data name="OpenGHelper" xml:space="preserve">
<value>開啟G-Helper視窗</value>
</data>
<data name="Optimized" xml:space="preserve">
<value>自動模式</value>
</data>
<data name="OptimizedGPUTooltip" xml:space="preserve">
<data name="OptimizedGPUTooltip" xml:space="preserve">
<value>使用電池切換到節能模式,插入電源時切換到標準模式</value>
</data>
<data name="Other" xml:space="preserve">
<data name="OptimizedUSBC" xml:space="preserve">
<value>自動模式下使用USB-C充電時持續關閉獨顯</value>
</data>
<data name="Other" xml:space="preserve">
<value>其他</value>
</data>
<data name="Overdrive" xml:space="preserve">
<data name="Overdrive" xml:space="preserve">
<value>OD</value>
</data>
<data name="PerformanceMode" xml:space="preserve">
<data name="PerformanceMode" xml:space="preserve">
<value>性能模式:</value>
</data>
<data name="PictureGif" xml:space="preserve">
<data name="PictureGif" xml:space="preserve">
<value>圖片/動圖</value>
</data>
<data name="PlayPause" xml:space="preserve">
<data name="PlayPause" xml:space="preserve">
<value>播放/暫停</value>
</data>
<data name="PowerLimits" xml:space="preserve">
<data name="PowerLimits" xml:space="preserve">
<value>功率限制 (PPT)</value>
</data>
<data name="PPTExperimental" xml:space="preserve">
<data name="PPTExperimental" xml:space="preserve">
<value>功率限制 (PPT) 是實驗性功能。 謹慎使用,風險自負!</value>
</data>
<data name="PrintScreen" xml:space="preserve">
<data name="PrintScreen" xml:space="preserve">
<value>截圖</value>
</data>
<data name="Quit" xml:space="preserve">
<data name="Quit" xml:space="preserve">
<value>退出</value>
</data>
<data name="RPM" xml:space="preserve">
<data name="RestartGPU" xml:space="preserve">
<value>有其他程式正在使用獨顯導致無法切換至節能模式. 是否在裝置管理員中重啟獨顯? * 請自行評估風險</value>
</data>
<data name="RPM" xml:space="preserve">
<value>每分鐘轉數</value>
</data>
<data name="RunOnStartup" xml:space="preserve">
<data name="RunOnStartup" xml:space="preserve">
<value>開機自動開啟</value>
</data>
<data name="Shutdown" xml:space="preserve">
<data name="Shutdown" xml:space="preserve">
<value>關機時</value>
</data>
<data name="Silent" xml:space="preserve">
<data name="Silent" xml:space="preserve">
<value>安靜模式</value>
</data>
<data name="Sleep" xml:space="preserve">
<data name="Sleep" xml:space="preserve">
<value>睡眠時</value>
</data>
<data name="StandardGPUTooltip" xml:space="preserve">
<data name="StandardGPUTooltip" xml:space="preserve">
<value>標準模式會啟用獨顯</value>
</data>
<data name="StandardMode" xml:space="preserve">
<data name="StandardMode" xml:space="preserve">
<value>標準模式</value>
</data>
<data name="StartupError" xml:space="preserve">
<data name="StartupError" xml:space="preserve">
<value>啟動錯誤</value>
</data>
<data name="ToggleAura" xml:space="preserve">
<data name="ToggleAura" xml:space="preserve">
<value>切換Aura</value>
</data>
<data name="Turbo" xml:space="preserve">
<data name="ToggleMiniled" xml:space="preserve">
<value>切換Miniled(若有支援)</value>
</data>
<data name="ToggleScreen" xml:space="preserve">
<value>切換螢幕</value>
</data>
<data name="Turbo" xml:space="preserve">
<value>極速模式</value>
</data>
<data name="TurnedOff" xml:space="preserve">
<data name="TurnedOff" xml:space="preserve">
<value>已關閉</value>
</data>
<data name="TurnOffOnBattery" xml:space="preserve">
<data name="TurnOffOnBattery" xml:space="preserve">
<value>電池模式時關閉</value>
</data>
<data name="UltimateGPUTooltip" xml:space="preserve">
<data name="UltimateGPUTooltip" xml:space="preserve">
<value>開啟獨顯直連獲得最佳幀數</value>
</data>
<data name="UltimateMode" xml:space="preserve">
<data name="UltimateMode" xml:space="preserve">
<value>獨顯直連</value>
</data>
<data name="VersionLabel" xml:space="preserve">
<data name="VersionLabel" xml:space="preserve">
<value>版本</value>
</data>
<data name="VolumeMute" xml:space="preserve">
<data name="VolumeMute" xml:space="preserve">
<value>靜音</value>
</data>
<data name="WindowTop" xml:space="preserve">
<data name="WindowTop" xml:space="preserve">
<value>視窗置頂</value>
</data>
</root>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 784 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

47
app/ScreenBrightness.cs Normal file
View File

@@ -0,0 +1,47 @@
namespace GHelper
{
using System;
using System.Diagnostics;
using System.Management;
public static class ScreenBrightness
{
public static int Get()
{
using var mclass = new ManagementClass("WmiMonitorBrightness")
{
Scope = new ManagementScope(@"\\.\root\wmi")
};
using var instances = mclass.GetInstances();
foreach (ManagementObject instance in instances)
{
return (byte)instance.GetPropertyValue("CurrentBrightness");
}
return 0;
}
public static void Set(int brightness)
{
using var mclass = new ManagementClass("WmiMonitorBrightnessMethods")
{
Scope = new ManagementScope(@"\\.\root\wmi")
};
using var instances = mclass.GetInstances();
var args = new object[] { 1, brightness };
foreach (ManagementObject instance in instances)
{
instance.InvokeMethod("WmiSetBrightness", args);
}
}
public static int Adjust(int delta)
{
int brightness = Get();
Debug.WriteLine(brightness);
brightness = Math.Min(100, Math.Max(0, brightness + delta));
Set(brightness);
return brightness;
}
}
}

View File

@@ -185,7 +185,7 @@ namespace GHelper
comboMatrixRunning.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboMatrixRunning.FormattingEnabled = true;
comboMatrixRunning.ItemHeight = 32;
comboMatrixRunning.Items.AddRange(new object[] { Properties.Strings.MatrixBanner, Properties.Strings.MatrixLogo, Properties.Strings.MatrixPicture, Properties.Strings.MatrixClock });
comboMatrixRunning.Items.AddRange(new object[] { Properties.Strings.MatrixBanner, Properties.Strings.MatrixLogo, Properties.Strings.MatrixPicture, Properties.Strings.MatrixClock, Properties.Strings.MatrixAudio });
comboMatrixRunning.Location = new Point(261, 10);
comboMatrixRunning.Margin = new Padding(4, 10, 4, 8);
comboMatrixRunning.Name = "comboMatrixRunning";
@@ -267,24 +267,25 @@ namespace GHelper
labelModel.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelModel.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
labelModel.ForeColor = SystemColors.ControlDark;
labelModel.Location = new Point(291, 119);
labelModel.Location = new Point(380, 119);
labelModel.Margin = new Padding(8, 0, 8, 0);
labelModel.Name = "labelModel";
labelModel.Size = new Size(492, 32);
labelModel.Size = new Size(400, 32);
labelModel.TabIndex = 38;
labelModel.TextAlign = ContentAlignment.TopRight;
//
// labelVersion
//
labelVersion.AutoSize = true;
labelVersion.AutoSize = false;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(25, 119);
labelVersion.Margin = new Padding(8, 0, 8, 0);
labelVersion.Name = "labelVersion";
labelVersion.Size = new Size(44, 32);
labelVersion.Size = new Size(300, 32);
labelVersion.TabIndex = 37;
labelVersion.Text = "v.0";
labelVersion.Cursor = Cursors.Hand;
//
// labelBattery
//

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,6 @@
using System.Drawing.Drawing2D;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using OSD;
@@ -41,12 +43,32 @@ namespace GHelper
}
}
class ToastForm : OSDNativeForm
public enum ToastIcon
{
BrightnessUp,
BrightnessDown,
BacklightUp,
BacklightDown,
Touchpad,
Microphone,
MicrophoneMute
}
public class ToastForm : OSDNativeForm
{
protected static string toastText = "Balanced";
protected static ToastIcon? toastIcon = null;
protected static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
public ToastForm()
{
timer.Tick += timer_Tick;
timer.Enabled = false;
timer.Interval = 2000;
}
protected override void PerformPaint(PaintEventArgs e)
{
Brush brush = new SolidBrush(Color.FromArgb(150,Color.Black));
@@ -56,17 +78,58 @@ namespace GHelper
format.LineAlignment = StringAlignment.Center;
format.Alignment = StringAlignment.Center;
e.Graphics.DrawString(toastText,
new Font("Segoe UI", 16f, FontStyle.Bold),
new SolidBrush(Color.White),
new PointF(this.Bound.Width/2, this.Bound.Height / 2),
format);
Bitmap? icon = null;
switch (toastIcon)
{
case ToastIcon.BrightnessUp:
icon = Properties.Resources.brightness_up;
break;
case ToastIcon.BrightnessDown:
icon = Properties.Resources.brightness_down;
break;
case ToastIcon.BacklightUp:
icon = Properties.Resources.backlight_up;
break;
case ToastIcon.BacklightDown:
icon = Properties.Resources.backlight_down;
break;
case ToastIcon.Microphone:
icon = Properties.Resources.icons8_microphone_96;
break;
case ToastIcon.MicrophoneMute:
icon = Properties.Resources.icons8_mute_unmute_96;
break;
case ToastIcon.Touchpad:
icon = Properties.Resources.icons8_touchpad_96;
break;
}
int shiftX = 0;
if (icon is not null)
{
e.Graphics.DrawImage(icon, 18, 18, 64, 64);
shiftX = 40;
}
e.Graphics.DrawString(toastText,
new Font("Segoe UI", 36f, FontStyle.Bold, GraphicsUnit.Pixel),
new SolidBrush(Color.White),
new PointF(this.Bound.Width / 2 + shiftX, this.Bound.Height / 2),
format);
}
public void RunToast(string text)
public void RunToast(string text, ToastIcon? icon = null)
{
//Hide();
timer.Stop();
toastText = text;
toastIcon = icon;
Screen screen1 = Screen.FromHandle(base.Handle);
Width = 300;
@@ -75,20 +138,15 @@ namespace GHelper
Y = screen1.Bounds.Height - 300 - this.Height;
Show();
timer.Stop();
timer.Tick -= timer_Tick;
timer.Tick += timer_Tick;
timer.Enabled = true;
timer.Interval = 2000;
timer.Start();
}
private void timer_Tick(object? sender, EventArgs e)
{
timer.Stop();
Debug.WriteLine("Toast end");
Hide();
timer.Stop();
}
}
}

View File

@@ -20,7 +20,7 @@ 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)
### [: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)
_If you post about the app - please include a link. Thanks._
@@ -32,12 +32,13 @@ _If you post about the app - please include a link. Thanks._
2. **GPU modes**: Eco - Standard - Ultimate - Optimized
3. Laptop screen refresh rate 60hz or 120hz (144hz, etc) with display overdrive (OD) and miniled multizone switch
4. Custom fan curve editor, power limits (PPT) and turbo boost selection for every performance mode
5. Anime matrix control thanks to [Starlight](https://github.com/vddCore/Starlight) + some tweaks from my side including animated GIFs
5. Anime matrix control thanks to [Starlight](https://github.com/vddCore/Starlight) + some tweaks from my side including animated GIFs, clock and autio visualizer
6. Keyboard backlit animation and colors (including sleep animation and support for TUF models)
7. Custom bindings for M3, M4 keys and FN+F5 (performance mode) FN+F4 (keyboard animation modes)
7. All basic and custom Keyboard hotkeys (M-keys, FN+X keys)
8. Monitor CPU / GPU temperature, fan speeds and battery discharge rate
9. Battery charge limit to preserve battery health
10. NVidia GPU overclocking
10. NVidia GPU overclocking
11. XG Mobile Control
### :gear: Automatic switching when on battery or plugged in
- Performance modes (app remembers last mode used on battery or when plugged)
@@ -94,14 +95,17 @@ Most probably either you are using Eco / Optimized mode and your dGPU is simply
#### It says, that app is already running
Please check system tray for a (G) icon. By default windows is keen to hide all icons, so you may need to click ^ to see them all. I would advise to right click on Task Bar select Task Bar Settings -> Other System Tray icons -> Mark G-Helper to be always ON.
#### App doesn't start / or crashes, what should I do ?
#### App doesn't crash or doesn't work properly what should I do ?
Open "Event Viewer" from 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.
#### 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.
#### Can I use MyASUS app along with G-Helper?
Sure, 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.
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)
@@ -119,8 +123,11 @@ It's a lightweight Armoury Crate alternative for Asus laptops. A small utility t
-----------------------------
## :euro: [Support Project](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA)
#### If you like the app you can make a [Donation via Paypal](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA)
[![QR Code](https://user-images.githubusercontent.com/5920850/233658717-0441494d-fede-4a2c-b4f2-4b16a184a69a.png)](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA)
#### If you like the app you can make a Donation
| [Paypal in EUR](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [Paypal in USD](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) |
| ------------------------------------------ | ----------------------------------------------- |
| [![QR Code](https://user-images.githubusercontent.com/5920850/233658717-0441494d-fede-4a2c-b4f2-4b16a184a69a.png)](https://www.paypal.com/donate/?hosted_button_id=4HMSHS4EBQWTA) | [![QR Code](https://github-production-user-asset-6210df.s3.amazonaws.com/5920850/239492811-b487e89a-3df6-42ea-bdb8-24c455ab2310.png)](https://www.paypal.com/donate/?hosted_button_id=SRM6QUX6ACXDY) |
----------------
@@ -138,12 +145,12 @@ 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 by running [this debloat bat file](https://raw.githubusercontent.com/seerge/g-helper/main/debloat.bat) as admin. To restore services - run [this bloat bat file](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.
- Also, it's not recommended to have "ASUS Smart Display Control" app running, as it will try to change refresh rates and fight with g-helper for the same function. You can safely uninstall it.
-------------------------------
Designed and developed for Asus Zephyrus G14 2022 (with AMD Radeon iGPU and dGPU). But could and should potentially work for G14 of 2021 and 2020, G15, X FLOW, and other ROG models for relevant and supported features.
@@ -189,14 +196,18 @@ 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 :)
To enable this custom workaround you need to add an extra line in In config.json (under ``%AppData%\GHelper``)
To enable this custom workaround you need to add an extra line in config.json (under ``%AppData%\GHelper``)
``gpu_reenable : 1,``
### Keybinding to toggle performance modes (on external keyboards)
By default app will toggle performance modes with Ctr+Shift+F5. You can change this binding by adding ``"keybind_profile": 116`` in config.json (under ``%AppData%\GHelper``), 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.
------------
**Disclaimers**
"ROG", "TUF", and "Armoury Crate" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.