Compare commits

...

39 Commits

Author SHA1 Message Date
seerge
58aa838e51 Update README.md 2023-03-03 12:50:28 +01:00
seerge
96c85f69fe Show performance notifications only when mode changes 2023-03-03 12:41:53 +01:00
seerge
8f215dafab Minor fixes 2023-03-03 01:00:47 +01:00
seerge
b3636fd447 Remember performance mode for plugged / battery 2023-03-02 21:05:02 +01:00
seerge
ed579f25d6 PPT for 2021 model 2023-03-02 19:17:10 +01:00
seerge
6a71a64c96 Removed GSharphelper task removal 2023-03-02 14:07:12 +01:00
seerge
ac69f1317e New screenshot 2023-03-02 13:01:06 +01:00
seerge
4b38d380b5 Fan label calibration 2023-03-02 12:51:56 +01:00
seerge
9a2f9afe5b Minor fixes, fan RPM display 2023-03-02 12:22:52 +01:00
seerge
ce9ec1b6df Merge branch 'main' of https://github.com/seerge/g14-helper 2023-03-02 00:07:15 +01:00
seerge
e68282050b Fan curve auto apply 2023-03-02 00:07:07 +01:00
seerge
6b8f61fab4 Update README.md 2023-03-01 18:36:53 +01:00
seerge
f59070cb96 Minor fixes 2023-03-01 11:45:43 +01:00
seerge
f47a00fde2 Update README.md 2023-02-28 19:42:30 +01:00
seerge
b15c15974e New screenshot 2023-02-28 19:25:04 +01:00
seerge
b5c47de3f2 Added power limits 2023-02-28 19:17:16 +01:00
seerge
6b88fe67d3 Fix for possible missing fans curve on G15 2023-02-28 17:32:47 +01:00
seerge
3ff2a5f946 New screenshot 2023-02-27 18:43:48 +01:00
seerge
c73c05c24a Project settings 2023-02-27 18:40:47 +01:00
seerge
1131035254 Basic key bindings, second keyboard color, minor fixes 2023-02-27 18:16:05 +01:00
seerge
1c23f8aad4 Merge branch 'main' of https://github.com/seerge/g14-helper 2023-02-25 13:24:34 +01:00
seerge
28aeeb7d57 Fixed GPU fan sensor 2023-02-25 13:24:31 +01:00
seerge
202cb84d12 Update README.md 2023-02-25 12:01:01 +01:00
seerge
0b4da0a66a Update README.md 2023-02-25 01:52:32 +01:00
seerge
bfa0a08cbc Merge branch 'main' of https://github.com/seerge/g14-helper 2023-02-25 01:43:18 +01:00
seerge
1417593413 Fixed bug with battery discharge sensor 2023-02-25 01:43:12 +01:00
seerge
5d4a08e1e2 Update README.md 2023-02-24 21:08:04 +01:00
seerge
8cc558e750 Update README.md 2023-02-24 21:07:42 +01:00
seerge
e0fe292358 Update README.md 2023-02-24 21:06:57 +01:00
seerge
a0bafa8843 Extra screenshot 2023-02-24 21:06:14 +01:00
seerge
b0a6163a1c Update README.md 2023-02-24 21:03:29 +01:00
seerge
f5805871d3 Update README.md 2023-02-24 21:02:58 +01:00
seerge
c811d940b1 Merge branch 'main' of https://github.com/seerge/g14-helper 2023-02-24 19:06:41 +01:00
seerge
a777929070 Resolution change fix attempt 2023-02-24 19:06:38 +01:00
seerge
9f72ba3486 Update README.md 2023-02-24 18:01:22 +01:00
seerge
d02703cf1c Wrap in case something goes wrong 2023-02-24 17:26:53 +01:00
seerge
4630fee687 Merge branch 'main' of https://github.com/seerge/g14-helper 2023-02-24 17:17:16 +01:00
seerge
e5890648b9 Added OSD notifications 2023-02-24 17:17:12 +01:00
seerge
c292226fa2 Update README.md 2023-02-23 19:56:22 +01:00
27 changed files with 1809 additions and 562 deletions

View File

@@ -25,6 +25,13 @@ public class ASUSWmi
public const uint DevsCPUFanCurve = 0x00110024;
public const uint DevsGPUFanCurve = 0x00110025;
public const int PPT_TotalA0 = 0x001200A0;
public const int PPT_TotalA1 = 0x001200A1;
public const int PPT_CPUB0 = 0x001200B0;
public const int PPT_CPUB1 = 0x001200B1;
public const int PPT_CPUA2 = 0x001200A2;
public const int PerformanceBalanced = 0;
public const int PerformanceTurbo = 1;
public const int PerformanceSilent = 2;
@@ -162,6 +169,11 @@ public class ASUSWmi
public void SetFanCurve(int device, byte[] curve)
{
if (curve.Length != 16) return;
if (curve.All(singleByte => singleByte == 0)) return;
Debug.WriteLine(BitConverter.ToString(curve));
if (device == 1)
DeviceSet(DevsGPUFanCurve, curve);
else

144
AppConfig.cs Normal file
View File

@@ -0,0 +1,144 @@
using System.Text.Json;
public class AppConfig
{
string appPath;
string configFile;
public Dictionary<string, object> config = new Dictionary<string, object>();
public AppConfig()
{
appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
configFile = appPath + "\\config.json";
if (!System.IO.Directory.Exists(appPath))
System.IO.Directory.CreateDirectory(appPath);
if (File.Exists(configFile))
{
string text = File.ReadAllText(configFile);
try
{
config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
}
catch
{
initConfig();
}
}
else
{
initConfig();
}
}
private void initConfig()
{
config = new Dictionary<string, object>();
config["performance_mode"] = 0;
string jsonString = JsonSerializer.Serialize(config);
File.WriteAllText(configFile, jsonString);
}
public int getConfig(string name)
{
if (config.ContainsKey(name))
return int.Parse(config[name].ToString());
else return -1;
}
public string getConfigString(string name)
{
if (config.ContainsKey(name))
return config[name].ToString();
else return null;
}
public void setConfig(string name, int value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(configFile, jsonString);
}
public void setConfig(string name, string value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(configFile, jsonString);
}
public string getParamName(int device, string paramName = "fan_profile")
{
int mode = getConfig("performance_mode");
string name;
if (device == 1)
name = "gpu";
else
name = "cpu";
return paramName+"_" + name + "_" + mode;
}
public byte[] getFanConfig(int device)
{
string curveString = getConfigString(getParamName(device));
byte[] curve = { };
if (curveString is not null)
curve = StringToBytes(curveString);
return curve;
}
public void setFanConfig(int device, byte[] curve)
{
string bitCurve = BitConverter.ToString(curve);
setConfig(getParamName(device), bitCurve);
}
public static byte[] StringToBytes(string str)
{
String[] arr = str.Split('-');
byte[] array = new byte[arr.Length];
for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);
return array;
}
public byte[] getDefaultCurve(int device)
{
int mode = getConfig("performance_mode");
byte[] curve;
switch (mode)
{
case 1:
if (device == 1)
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)
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)
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");
break;
}
return curve;
}
}

22
Aura.cs
View File

@@ -10,11 +10,11 @@ public class Aura
public const int Breathe = 1;
public const int Strobe = 2;
public const int Rainbow = 3;
public const int Dingding = 10;
public const int Dingding = 4;
public const int SpeedSlow = 0;
public const int SpeedMedium = 1;
public const int SpeedHigh = 2;
public const int SpeedSlow = 0xe1;
public const int SpeedMedium = 0xeb;
public const int SpeedHigh = 0xf5;
public static int Mode = Static;
public static Color Color1 = Color.White;
@@ -47,6 +47,20 @@ public class Aura
HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
if (Mode == Dingding)
{
Mode = 10;
Speed = SpeedMedium;
}
else if (Mode == Rainbow)
{
Speed = SpeedMedium;
}
else
{
Speed = SpeedSlow;
}
foreach (HidDevice device in HidDeviceList)
{
if (device.IsConnected)

206
Fans.Designer.cs generated
View File

@@ -29,38 +29,44 @@
private void InitializeComponent()
{
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
System.Windows.Forms.DataVisualization.Charting.Series series2 = new System.Windows.Forms.DataVisualization.Charting.Series();
chartCPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
buttonApply = new Button();
buttonReset = new Button();
chartGPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
groupBox1 = new GroupBox();
labelApplied = new Label();
pictureFine = new PictureBox();
labelInfo = new Label();
labelCPU = new Label();
labelTotal = new Label();
label2 = new Label();
label1 = new Label();
trackCPU = new TrackBar();
trackTotal = new TrackBar();
buttonApplyPower = new Button();
checkAuto = new CheckBox();
((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureFine).BeginInit();
((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();
((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();
SuspendLayout();
//
// chartCPU
//
chartArea1.Name = "ChartArea1";
chartCPU.ChartAreas.Add(chartArea1);
legend1.Name = "Legend1";
chartCPU.Legends.Add(legend1);
chartCPU.Location = new Point(16, 13);
chartCPU.Location = new Point(362, 30);
chartCPU.Name = "chartCPU";
series1.ChartArea = "ChartArea1";
series1.Legend = "Legend1";
series1.Name = "Series1";
chartCPU.Series.Add(series1);
chartCPU.Size = new Size(900, 446);
chartCPU.Size = new Size(772, 464);
chartCPU.TabIndex = 0;
chartCPU.Text = "chartCPU";
//
// buttonApply
//
buttonApply.Location = new Point(662, 944);
buttonApply.Location = new Point(879, 1016);
buttonApply.Name = "buttonApply";
buttonApply.Size = new Size(254, 46);
buttonApply.TabIndex = 1;
@@ -69,7 +75,7 @@
//
// buttonReset
//
buttonReset.Location = new Point(402, 944);
buttonReset.Location = new Point(362, 1016);
buttonReset.Name = "buttonReset";
buttonReset.Size = new Size(254, 46);
buttonReset.TabIndex = 2;
@@ -80,23 +86,157 @@
//
chartArea2.Name = "ChartArea1";
chartGPU.ChartAreas.Add(chartArea2);
legend2.Name = "Legend1";
chartGPU.Legends.Add(legend2);
chartGPU.Location = new Point(16, 477);
chartGPU.Location = new Point(362, 511);
chartGPU.Name = "chartGPU";
series2.ChartArea = "ChartArea1";
series2.Legend = "Legend1";
series2.Name = "Series1";
chartGPU.Series.Add(series2);
chartGPU.Size = new Size(900, 448);
chartGPU.Size = new Size(772, 480);
chartGPU.TabIndex = 3;
chartGPU.Text = "chart1";
//
// groupBox1
//
groupBox1.Controls.Add(labelApplied);
groupBox1.Controls.Add(pictureFine);
groupBox1.Controls.Add(labelInfo);
groupBox1.Controls.Add(labelCPU);
groupBox1.Controls.Add(labelTotal);
groupBox1.Controls.Add(label2);
groupBox1.Controls.Add(label1);
groupBox1.Controls.Add(trackCPU);
groupBox1.Controls.Add(trackTotal);
groupBox1.Location = new Point(12, 12);
groupBox1.Name = "groupBox1";
groupBox1.Padding = new Padding(5);
groupBox1.Size = new Size(330, 979);
groupBox1.TabIndex = 4;
groupBox1.TabStop = false;
groupBox1.Text = "Power Limits (PPT)";
//
// labelApplied
//
labelApplied.AutoSize = true;
labelApplied.ForeColor = Color.Tomato;
labelApplied.Location = new Point(14, 39);
labelApplied.Name = "labelApplied";
labelApplied.Size = new Size(143, 32);
labelApplied.TabIndex = 13;
labelApplied.Text = "Not Applied";
//
// pictureFine
//
pictureFine.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
pictureFine.BackgroundImage = Properties.Resources.everything_is_fine_itsfine;
pictureFine.BackgroundImageLayout = ImageLayout.Zoom;
pictureFine.Location = new Point(9, 731);
pictureFine.Name = "pictureFine";
pictureFine.Size = new Size(311, 240);
pictureFine.TabIndex = 12;
pictureFine.TabStop = false;
pictureFine.Visible = false;
//
// labelInfo
//
labelInfo.AutoSize = true;
labelInfo.Dock = DockStyle.Bottom;
labelInfo.Location = new Point(5, 942);
labelInfo.Name = "labelInfo";
labelInfo.Size = new Size(65, 32);
labelInfo.TabIndex = 11;
labelInfo.Text = "label";
//
// labelCPU
//
labelCPU.AutoSize = true;
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelCPU.Location = new Point(197, 125);
labelCPU.Name = "labelCPU";
labelCPU.Size = new Size(61, 32);
labelCPU.TabIndex = 10;
labelCPU.Text = "CPU";
labelCPU.TextAlign = ContentAlignment.MiddleCenter;
//
// labelTotal
//
labelTotal.AutoSize = true;
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelTotal.Location = new Point(39, 125);
labelTotal.Name = "labelTotal";
labelTotal.Size = new Size(70, 32);
labelTotal.TabIndex = 9;
labelTotal.Text = "Total";
labelTotal.TextAlign = ContentAlignment.MiddleCenter;
//
// label2
//
label2.AutoSize = true;
label2.Location = new Point(200, 91);
label2.Name = "label2";
label2.Size = new Size(58, 32);
label2.TabIndex = 8;
label2.Text = "CPU";
label2.TextAlign = ContentAlignment.MiddleCenter;
//
// label1
//
label1.AutoSize = true;
label1.Location = new Point(41, 91);
label1.Name = "label1";
label1.Size = new Size(65, 32);
label1.TabIndex = 7;
label1.Text = "Total";
label1.TextAlign = ContentAlignment.MiddleCenter;
//
// trackCPU
//
trackCPU.Location = new Point(203, 178);
trackCPU.Maximum = 85;
trackCPU.Minimum = 15;
trackCPU.Name = "trackCPU";
trackCPU.Orientation = Orientation.Vertical;
trackCPU.Size = new Size(90, 444);
trackCPU.TabIndex = 6;
trackCPU.TickFrequency = 5;
trackCPU.Value = 80;
//
// trackTotal
//
trackTotal.Location = new Point(42, 178);
trackTotal.Maximum = 150;
trackTotal.Minimum = 15;
trackTotal.Name = "trackTotal";
trackTotal.Orientation = Orientation.Vertical;
trackTotal.Size = new Size(90, 444);
trackTotal.TabIndex = 5;
trackTotal.TickFrequency = 5;
trackTotal.TickStyle = TickStyle.TopLeft;
trackTotal.Value = 125;
//
// buttonApplyPower
//
buttonApplyPower.Location = new Point(15, 1016);
buttonApplyPower.Name = "buttonApplyPower";
buttonApplyPower.Size = new Size(327, 46);
buttonApplyPower.TabIndex = 11;
buttonApplyPower.Text = "Apply Power Limits";
buttonApplyPower.UseVisualStyleBackColor = true;
//
// checkAuto
//
checkAuto.AutoSize = true;
checkAuto.Location = new Point(708, 1022);
checkAuto.Name = "checkAuto";
checkAuto.Size = new Size(165, 36);
checkAuto.TabIndex = 12;
checkAuto.Text = "Auto Apply";
checkAuto.UseVisualStyleBackColor = true;
//
// Fans
//
AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(940, 1020);
ClientSize = new Size(1154, 1089);
Controls.Add(checkAuto);
Controls.Add(buttonApplyPower);
Controls.Add(groupBox1);
Controls.Add(chartGPU);
Controls.Add(buttonReset);
Controls.Add(buttonApply);
@@ -109,10 +249,16 @@
ShowIcon = false;
ShowInTaskbar = false;
StartPosition = FormStartPosition.CenterScreen;
Text = "Fans";
Text = "Fans and Power";
((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();
((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
((System.ComponentModel.ISupportInitialize)pictureFine).EndInit();
((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();
((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();
ResumeLayout(false);
PerformLayout();
}
#endregion
@@ -121,5 +267,17 @@
private Button buttonApply;
private Button buttonReset;
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
private GroupBox groupBox1;
private Label labelCPU;
private Label labelTotal;
private Label label2;
private Label label1;
private TrackBar trackCPU;
private TrackBar trackTotal;
private Button buttonApplyPower;
private Label labelInfo;
private PictureBox pictureFine;
private Label labelApplied;
private CheckBox checkAuto;
}
}

220
Fans.cs
View File

@@ -11,6 +11,14 @@ namespace GHelper
Series seriesCPU;
Series seriesGPU;
const int MaxTotal = 150;
const int MinTotal = 15;
const int DefaultTotal = 125;
const int MaxCPU = 90;
const int MinCPU = 15;
const int DefaultCPU = 80;
void SetChart(Chart chart, int device)
{
@@ -18,7 +26,7 @@ namespace GHelper
if (device == 1)
title = "GPU Fan Profile";
else
else
title = "CPU Fan Profile";
if (Program.settingsForm.perfName.Length > 0)
@@ -29,19 +37,36 @@ namespace GHelper
else
chart.Titles.Add(title);
chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
chart.ChartAreas[0].AxisX.Minimum = 10;
chart.ChartAreas[0].AxisX.Maximum = 100;
chart.ChartAreas[0].AxisX.Interval = 10;
chart.ChartAreas[0].AxisY.Minimum = 0;
chart.ChartAreas[0].AxisY.Maximum = 100;
chart.Legends[0].Enabled = false;
chart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Arial", 7F);
chart.ChartAreas[0].AxisY.CustomLabels.Add(-2, 2, "OFF");
for (int i = 1; i <= 9; i++)
chart.ChartAreas[0].AxisY.CustomLabels.Add(i * 10 - 2, i * 10 + 2, (1800 + 400 * i).ToString());
chart.ChartAreas[0].AxisY.CustomLabels.Add(98, 102, "RPM");
chart.ChartAreas[0].AxisY.Interval = 10;
if (chart.Legends.Count > 0)
chart.Legends[0].Enabled = false;
}
private void Fans_Shown(object? sender, EventArgs e)
{
Top = Program.settingsForm.Top;
Left = Program.settingsForm.Left - Width - 10;
Left = Program.settingsForm.Left - Width - 5;
}
public Fans()
@@ -49,14 +74,14 @@ namespace GHelper
InitializeComponent();
FormClosing += Fans_FormClosing;
seriesCPU = chartCPU.Series.Add("CPU");
seriesGPU = chartGPU.Series.Add("GPU");
seriesCPU.Color = Color.Blue;
seriesGPU.Color = Color.Red;
LoadFans();
chartCPU.MouseMove += ChartCPU_MouseMove;
chartCPU.MouseUp += ChartCPU_MouseUp;
@@ -66,41 +91,134 @@ namespace GHelper
buttonReset.Click += ButtonReset_Click;
buttonApply.Click += ButtonApply_Click;
trackTotal.Maximum = MaxTotal;
trackTotal.Minimum = MinTotal;
trackCPU.Maximum = MaxCPU;
trackCPU.Minimum = MinCPU;
trackCPU.Scroll += TrackCPU_Scroll;
trackTotal.Scroll += TrackTotal_Scroll;
buttonApplyPower.Click += ButtonApplyPower_Click;
checkAuto.Click += CheckAuto_Click;
//labelInfo.MaximumSize = new Size(280, 0);
labelInfo.Text = "Power Limits (PPT) is\nexperimental feature.\n\nValues will be applied\nonly after you click 'Apply'\nand reset after performance\nmode changes.\n\nUse carefully and\non your own risk!";
LoadFans();
VisualisePower(true);
Shown += Fans_Shown;
}
private void CheckAuto_Click(object? sender, EventArgs e)
{
if (sender is null)
return;
CheckBox chk = (CheckBox)sender;
Program.config.setConfig("auto_apply_" + Program.config.getConfig("performance_mode"), chk.Checked ? 1 : 0);
}
private void Fans_FormClosing(object? sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
private void ButtonApplyPower_Click(object? sender, EventArgs e)
{
int limit_total = trackTotal.Value;
int limit_cpu = trackCPU.Value;
Program.config.setConfig("limit_total", limit_total);
Program.config.setConfig("limit_cpu", limit_cpu);
Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA0, limit_total);
Program.wmi.DeviceSet(ASUSWmi.PPT_TotalA1, limit_total);
Program.wmi.DeviceSet(ASUSWmi.PPT_CPUB0, limit_cpu);
Program.wmi.DeviceSet(ASUSWmi.PPT_CPUA2, limit_cpu);
labelApplied.ForeColor = Color.Blue;
labelApplied.Text = "Applied";
}
public void VisualisePower(bool init = false)
{
int limit_total;
int limit_cpu;
if (init)
{
limit_total = Program.config.getConfig("limit_total");
limit_cpu = Program.config.getConfig("limit_cpu");
}
else
{
limit_total = trackTotal.Value;
limit_cpu = trackCPU.Value;
}
if (limit_total < 0) limit_total = DefaultTotal;
if (limit_total > MaxTotal) limit_total = MaxTotal;
if (limit_total < MinTotal) limit_total = MinTotal;
if (limit_cpu < 0) limit_cpu = DefaultCPU;
if (limit_cpu > MaxCPU) limit_cpu = MaxCPU;
if (limit_cpu < MinCPU) limit_cpu = MinCPU;
if (limit_cpu > limit_total) limit_cpu = limit_total;
trackTotal.Value = limit_total;
trackCPU.Value = limit_cpu;
labelTotal.Text = trackTotal.Value.ToString() + "W";
labelCPU.Text = trackCPU.Value.ToString() + "W";
pictureFine.Visible = (limit_cpu > 85 || limit_total > 145);
}
private void TrackTotal_Scroll(object? sender, EventArgs e)
{
VisualisePower();
}
private void TrackCPU_Scroll(object? sender, EventArgs e)
{
VisualisePower();
}
public void ResetApplyLabel()
{
labelApplied.ForeColor = Color.Red;
labelApplied.Text = "Not Applied";
}
public void LoadFans()
{
SetChart(chartCPU, 0);
SetChart(chartGPU, 0);
SetChart(chartGPU, 1);
LoadProfile(seriesCPU, 0);
LoadProfile(seriesGPU, 1);
int auto_apply = Program.config.getConfig("auto_apply_" + Program.config.getConfig("performance_mode"));
checkAuto.Checked = (auto_apply == 1);
}
byte[] StringToBytes(string str)
{
String[] arr = str.Split('-');
byte[] array = new byte[arr.Length];
for (int i = 0; i < arr.Length; i++) array[i] = Convert.ToByte(arr[i], 16);
return array;
}
string GetFanName(int device)
{
int mode = Program.config.getConfig("performance_mode");
string name;
if (device == 1)
name = "gpu";
else
name = "cpu";
return "fan_profile_" + name + "_" + mode;
}
void LoadProfile(Series series, int device, int def = 0)
{
@@ -112,15 +230,13 @@ namespace GHelper
series.Points.Clear();
int mode = Program.config.getConfig("performance_mode");
string curveString = Program.config.getConfigString(GetFanName(device));
byte[] curve = { };
if (curveString is not null)
curve = StringToBytes(curveString);
byte[] curve = Program.config.getFanConfig(device);
if (def == 1 || curve.Length != 16)
curve = Program.wmi.GetFanCurve(device, mode);
if (curve.All(singleByte => singleByte == 0))
Program.config.getDefaultCurve(device);
//Debug.WriteLine(BitConverter.ToString(curve));
@@ -145,10 +261,7 @@ namespace GHelper
i++;
}
string bitCurve = BitConverter.ToString(curve);
Debug.WriteLine(bitCurve);
Program.config.setConfig(GetFanName(device), bitCurve);
Program.config.setFanConfig(device, curve);
Program.wmi.SetFanCurve(device, curve);
}
@@ -164,7 +277,13 @@ namespace GHelper
{
LoadProfile(seriesCPU, 0, 1);
LoadProfile(seriesGPU, 1, 1);
checkAuto.Checked = false;
Program.config.setConfig("auto_apply_" + Program.config.getConfig("performance_mode"), 0);
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"));
ResetApplyLabel();
}
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
@@ -192,18 +311,33 @@ namespace GHelper
if (curPoint != null)
{
Series s = hit.Series;
double dx = ax.PixelPositionToValue(e.X);
double dy = ay.PixelPositionToValue(e.Y);
double dx, dy, dymin;
if (dx < 0) dx = 0;
if (dx > 100) dx = 100;
try
{
dx = ax.PixelPositionToValue(e.X);
dy = ay.PixelPositionToValue(e.Y);
if (dy < 0) dy = 0;
if (dy > 100) dy = 100;
if (dx < 20) dx = 20;
if (dx > 100) dx = 100;
curPoint.XValue = dx;
curPoint.YValues[0] = dy;
if (dy < 0) dy = 0;
if (dy > 100) dy = 100;
dymin = (dx - 60) * 1.2;
if (dy < dymin) dy = dymin;
curPoint.XValue = dx;
curPoint.YValues[0] = dy;
}
catch
{
Debug.WriteLine(e.Y);
}
}
}
}

View File

@@ -13,7 +13,9 @@
<Platforms>AnyCPU;x64</Platforms>
<SupportedOSPlatformVersion>8.0</SupportedOSPlatformVersion>
<AssemblyName>GHelper</AssemblyName>
<PlatformTarget>AnyCPU</PlatformTarget>
<PlatformTarget>x64</PlatformTarget>
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
<AssemblyVersion>0.14.0</AssemblyVersion>
</PropertyGroup>
<ItemGroup>
@@ -97,4 +99,8 @@
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="screenshots\" />
</ItemGroup>
</Project>

View File

@@ -18,12 +18,12 @@ Global
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.ActiveCfg = Debug|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|Any CPU.Build.0 = Debug|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.ActiveCfg = Release|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Debug|x64.Build.0 = Release|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.Build.0 = Release|Any CPU
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.ActiveCfg = Release|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|Any CPU.Build.0 = Release|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.ActiveCfg = Release|x64
{D6138BB1-8FDB-4835-87EF-2FE41A3DD604}.Release|x64.Build.0 = Release|x64
EndGlobalSection

139
Keyboard.Designer.cs generated Normal file
View File

@@ -0,0 +1,139 @@
namespace GHelper
{
partial class Keyboard
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
groupBox1 = new GroupBox();
textM4 = new TextBox();
textM3 = new TextBox();
comboM4 = new ComboBox();
labelM4 = new Label();
comboM3 = new ComboBox();
labelM3 = new Label();
groupBox1.SuspendLayout();
SuspendLayout();
//
// groupBox1
//
groupBox1.Controls.Add(textM4);
groupBox1.Controls.Add(textM3);
groupBox1.Controls.Add(comboM4);
groupBox1.Controls.Add(labelM4);
groupBox1.Controls.Add(comboM3);
groupBox1.Controls.Add(labelM3);
groupBox1.Dock = DockStyle.Top;
groupBox1.Location = new Point(10, 10);
groupBox1.Name = "groupBox1";
groupBox1.Size = new Size(751, 196);
groupBox1.TabIndex = 0;
groupBox1.TabStop = false;
groupBox1.Text = "Key Bindings";
//
// textM4
//
textM4.Location = new Point(411, 113);
textM4.Name = "textM4";
textM4.PlaceholderText = "notepad /p \"file.txt\"";
textM4.Size = new Size(320, 39);
textM4.TabIndex = 5;
//
// textM3
//
textM3.Location = new Point(411, 54);
textM3.Name = "textM3";
textM3.PlaceholderText = "notepad /p \"file.txt\"";
textM3.Size = new Size(320, 39);
textM3.TabIndex = 4;
//
// comboM4
//
comboM4.FormattingEnabled = true;
comboM4.Items.AddRange(new object[] { "Performance Mode", "Open G-Helper window", "Custom" });
comboM4.Location = new Point(93, 112);
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.FormattingEnabled = true;
comboM3.Items.AddRange(new object[] { "Volume Mute", "Play / Pause", "Toggle Aura", "Custom" });
comboM3.Location = new Point(93, 54);
comboM3.Name = "comboM3";
comboM3.Size = new Size(312, 40);
comboM3.TabIndex = 1;
//
// labelM3
//
labelM3.AutoSize = true;
labelM3.Location = new Point(25, 58);
labelM3.Name = "labelM3";
labelM3.Size = new Size(54, 32);
labelM3.TabIndex = 0;
labelM3.Text = "M3:";
//
// Keyboard
//
AutoScaleDimensions = new SizeF(13F, 32F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(771, 858);
Controls.Add(groupBox1);
FormBorderStyle = FormBorderStyle.FixedSingle;
MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false;
Name = "Keyboard";
Padding = new Padding(10);
ShowIcon = false;
ShowInTaskbar = false;
Text = "Keyboard";
groupBox1.ResumeLayout(false);
groupBox1.PerformLayout();
ResumeLayout(false);
}
#endregion
private GroupBox groupBox1;
private Label labelM3;
private ComboBox comboM3;
private ComboBox comboM4;
private Label labelM4;
private TextBox textM4;
private TextBox textM3;
}
}

72
Keyboard.cs Normal file
View File

@@ -0,0 +1,72 @@
namespace GHelper
{
public partial class Keyboard : Form
{
public Keyboard()
{
InitializeComponent();
comboM3.DropDownStyle = ComboBoxStyle.DropDownList;
comboM3.SelectedIndex = 0;
comboM4.DropDownStyle = ComboBoxStyle.DropDownList;
comboM4.SelectedIndex = 0;
comboM3.SelectedValueChanged += ComboM3_SelectedValueChanged;
comboM4.SelectedValueChanged += ComboM4_SelectedValueChanged;
textM3.TextChanged += TextM3_TextChanged;
textM4.TextChanged += TextM4_TextChanged;
Shown += Keyboard_Shown;
}
private void TextM3_TextChanged(object? sender, EventArgs e)
{
if (sender is null) return;
TextBox tb = (TextBox)sender;
Program.config.setConfig("m3_custom", tb.Text);
}
private void TextM4_TextChanged(object? sender, EventArgs e)
{
if (sender is null) return;
TextBox tb = (TextBox)sender;
Program.config.setConfig("m4_custom", tb.Text);
}
private void ComboM4_SelectedValueChanged(object? sender, EventArgs e)
{
if (sender is null) return;
ComboBox cmb = (ComboBox)sender;
Program.config.setConfig("m4", cmb.SelectedIndex);
}
private void ComboM3_SelectedValueChanged(object? sender, EventArgs e)
{
if (sender is null) return;
ComboBox cmb = (ComboBox)sender;
Program.config.setConfig("m3", cmb.SelectedIndex);
}
private void Keyboard_Shown(object? sender, EventArgs e)
{
Top = Program.settingsForm.Top;
Left = Program.settingsForm.Left - Width - 5;
int m3 = Program.config.getConfig("m3");
int m4 = Program.config.getConfig("m4");
if (m3 != -1)
comboM3.SelectedIndex = m3;
if (m4 != -1)
comboM4.SelectedIndex = m4;
textM3.Text = Program.config.getConfigString("m3_custom");
textM4.Text = Program.config.getConfigString("m4_custom");
}
}
}

View File

@@ -4,6 +4,22 @@ using System.Runtime.InteropServices;
public class NativeMethods
{
public const int KEYEVENTF_EXTENDEDKEY = 1;
public const int KEYEVENTF_KEYUP = 2;
public const int VK_MEDIA_NEXT_TRACK = 0xB0;
public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
public const int VK_MEDIA_PREV_TRACK = 0xB1;
public const int VK_VOLUME_MUTE = 0xAD;
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
public static void KeyPress(int key = VK_MEDIA_PLAY_PAUSE)
{
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
}
[DllImport("user32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);

463
OSDBase.cs Normal file
View File

@@ -0,0 +1,463 @@
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
namespace OSD
{
class OSDNativeForm : NativeWindow, IDisposable
{
private bool _disposed = false;
private byte _alpha = 250;
private Size _size = new Size(350, 50);
private Point _location = new Point(50, 50);
protected virtual void PerformPaint(PaintEventArgs e)
{
}
protected internal void Invalidate()
{
this.UpdateLayeredWindow();
}
private void UpdateLayeredWindow()
{
Bitmap bitmap1 = new Bitmap(this.Size.Width, this.Size.Height, PixelFormat.Format32bppArgb);
using (Graphics graphics1 = Graphics.FromImage(bitmap1))
{
Rectangle rectangle1;
SIZE size1;
POINT point1;
POINT point2;
BLENDFUNCTION blendfunction1;
rectangle1 = new Rectangle(0, 0, this.Size.Width, this.Size.Height);
PerformPaint(new PaintEventArgs(graphics1, rectangle1));
IntPtr ptr1 = User32.GetDC(IntPtr.Zero);
IntPtr ptr2 = Gdi32.CreateCompatibleDC(ptr1);
IntPtr ptr3 = bitmap1.GetHbitmap(Color.FromArgb(0));
IntPtr ptr4 = Gdi32.SelectObject(ptr2, ptr3);
size1.cx = this.Size.Width;
size1.cy = this.Size.Height;
point1.x = this.Location.X;
point1.x = this.Location.X;
point1.y = this.Location.Y;
point2.x = 0;
point2.y = 0;
blendfunction1 = new BLENDFUNCTION();
blendfunction1.BlendOp = 0;
blendfunction1.BlendFlags = 0;
blendfunction1.SourceConstantAlpha = this._alpha;
blendfunction1.AlphaFormat = 1;
User32.UpdateLayeredWindow(base.Handle, ptr1, ref point1, ref size1, ptr2, ref point2, 0, ref blendfunction1, 2); //2=ULW_ALPHA
Gdi32.SelectObject(ptr2, ptr4);
User32.ReleaseDC(IntPtr.Zero, ptr1);
Gdi32.DeleteObject(ptr3);
Gdi32.DeleteDC(ptr2);
}
}
public virtual void Show()
{
if (base.Handle == IntPtr.Zero) //if handle don't equal to zero - window was created and just hided
this.CreateWindowOnly();
User32.ShowWindow(base.Handle, User32.SW_SHOWNOACTIVATE);
}
public virtual void Hide()
{
if (base.Handle == IntPtr.Zero)
return;
User32.ShowWindow(base.Handle, User32.SW_HIDE);
this.DestroyHandle();
}
public virtual void Close()
{
this.Hide();
this.Dispose();
}
private void CreateWindowOnly()
{
CreateParams params1 = new CreateParams();
params1.Caption = "FloatingNativeWindow";
int nX = this._location.X;
int nY = this._location.Y;
Screen screen1 = Screen.FromHandle(base.Handle);
if ((nX + this._size.Width) > screen1.Bounds.Width)
{
nX = screen1.Bounds.Width - this._size.Width;
}
if ((nY + this._size.Height) > screen1.Bounds.Height)
{
nY = screen1.Bounds.Height - this._size.Height;
}
this._location = new Point(nX, nY);
Size size1 = this._size;
Point point1 = this._location;
params1.X = nX;
params1.Y = nY;
params1.Height = size1.Height;
params1.Width = size1.Width;
params1.Parent = IntPtr.Zero;
uint ui = User32.WS_POPUP;
params1.Style = (int)ui;
params1.ExStyle = User32.WS_EX_TOPMOST | User32.WS_EX_TOOLWINDOW | User32.WS_EX_LAYERED | User32.WS_EX_NOACTIVATE | User32.WS_EX_TRANSPARENT;
this.CreateHandle(params1);
this.UpdateLayeredWindow();
}
protected virtual void SetBoundsCore(int x, int y, int width, int height)
{
if (((this.X != x) || (this.Y != y)) || ((this.Width != width) || (this.Height != height)))
{
if (base.Handle != IntPtr.Zero)
{
int num1 = 20;
if ((this.X == x) && (this.Y == y))
{
num1 |= 2;
}
if ((this.Width == width) && (this.Height == height))
{
num1 |= 1;
}
User32.SetWindowPos(base.Handle, IntPtr.Zero, x, y, width, height, (uint)num1);
}
else
{
this.Location = new Point(x, y);
this.Size = new Size(width, height);
}
}
}
#region # Properties #
/// <summary>
/// Get or set position of top-left corner of floating native window in screen coordinates
/// </summary>
public virtual Point Location
{
get { return this._location; }
set
{
if (base.Handle != IntPtr.Zero)
{
this.SetBoundsCore(value.X, value.Y, this._size.Width, this._size.Height);
RECT rect = new RECT();
User32.GetWindowRect(base.Handle, ref rect);
this._location = new Point(rect.left, rect.top);
this.UpdateLayeredWindow();
}
else
{
this._location = value;
}
}
}
/// <summary>
/// Get or set size of client area of floating native window
/// </summary>
public virtual Size Size
{
get { return this._size; }
set
{
if (base.Handle != IntPtr.Zero)
{
this.SetBoundsCore(this._location.X, this._location.Y, value.Width, value.Height);
RECT rect = new RECT();
User32.GetWindowRect(base.Handle, ref rect);
this._size = new Size(rect.right - rect.left, rect.bottom - rect.top);
this.UpdateLayeredWindow();
}
else
{
this._size = value;
}
}
}
/// <summary>
/// Gets or sets the height of the floating native window
/// </summary>
public int Height
{
get { return this._size.Height; }
set
{
this._size = new Size(this._size.Width, value);
}
}
/// <summary>
/// Gets or sets the width of the floating native window
/// </summary>
public int Width
{
get { return this._size.Width; }
set
{
this._size = new Size(value, this._size.Height);
}
}
/// <summary>
/// Get or set x-coordinate of top-left corner of floating native window in screen coordinates
/// </summary>
public int X
{
get { return this._location.X; }
set
{
this.Location = new Point(value, this.Location.Y);
}
}
/// <summary>
/// Get or set y-coordinate of top-left corner of floating native window in screen coordinates
/// </summary>
public int Y
{
get { return this._location.Y; }
set
{
this.Location = new Point(this.Location.X, value);
}
}
/// <summary>
/// Get rectangle represented client area of floating native window in client coordinates(top-left corner always has coord. 0,0)
/// </summary>
public Rectangle Bound
{
get
{
return new Rectangle(new Point(0, 0), this._size);
}
}
/// <summary>
/// Get or set full opacity(255) or full transparency(0) or any intermediate state for floating native window transparency
/// </summary>
public byte Alpha
{
get { return this._alpha; }
set
{
if (this._alpha == value) return;
this._alpha = value;
this.UpdateLayeredWindow();
}
}
#endregion
#region IDisposable Members
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this._disposed)
{
this.DestroyHandle();
this._disposed = true;
}
}
#endregion
}
#region # Win32 #
[StructLayout(LayoutKind.Sequential)]
internal struct POINT
{
public int x;
public int y;
}
[StructLayout(LayoutKind.Sequential)]
internal struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
[StructLayout(LayoutKind.Sequential)]
internal struct SIZE
{
public int cx;
public int cy;
}
[StructLayout(LayoutKind.Sequential)]
internal struct TRACKMOUSEEVENTS
{
public uint cbSize;
public uint dwFlags;
public IntPtr hWnd;
public uint dwHoverTime;
}
[StructLayout(LayoutKind.Sequential)]
internal struct MSG
{
public IntPtr hwnd;
public int message;
public IntPtr wParam;
public IntPtr lParam;
public int time;
public int pt_x;
public int pt_y;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}
internal class User32
{
public const uint WS_POPUP = 0x80000000;
public const int WS_EX_TOPMOST = 0x8;
public const int WS_EX_TOOLWINDOW = 0x80;
public const int WS_EX_LAYERED = 0x80000;
public const int WS_EX_TRANSPARENT = 0x20;
public const int WS_EX_NOACTIVATE = 0x08000000;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_HIDE = 0;
public const uint AW_HOR_POSITIVE = 0x1;
public const uint AW_HOR_NEGATIVE = 0x2;
public const uint AW_VER_POSITIVE = 0x4;
public const uint AW_VER_NEGATIVE = 0x8;
public const uint AW_CENTER = 0x10;
public const uint AW_HIDE = 0x10000;
public const uint AW_ACTIVATE = 0x20000;
public const uint AW_SLIDE = 0x40000;
public const uint AW_BLEND = 0x80000;
// Methods
private User32()
{
}
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool AnimateWindow(IntPtr hWnd, uint dwTime, uint dwFlags);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ClientToScreen(IntPtr hWnd, ref POINT pt);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool DispatchMessage(ref MSG msg);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool DrawFocusRect(IntPtr hWnd, ref RECT rect);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetDC(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetFocus();
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern ushort GetKeyState(int virtKey);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool GetMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool GetClientRect(IntPtr hWnd, [In, Out] ref RECT rect);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr GetWindow(IntPtr hWnd, int cmd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool HideCaret(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool InvalidateRect(IntPtr hWnd, ref RECT rect, bool erase);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr LoadCursor(IntPtr hInstance, uint cursor);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern int MapWindowPoints(IntPtr hWndFrom, IntPtr hWndTo, [In, Out] ref RECT rect, int cPoints);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool MoveWindow(IntPtr hWnd, int x, int y, int width, int height, bool repaint);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool PeekMessage(ref MSG msg, int hWnd, uint wFilterMin, uint wFilterMax, uint wFlag);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ReleaseCapture();
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ScreenToClient(IntPtr hWnd, ref POINT pt);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern uint SendMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SetCursor(IntPtr hCursor);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int newLong);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int SetWindowPos(IntPtr hWnd, IntPtr hWndAfter, int X, int Y, int Width, int Height, uint flags);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool SetWindowRgn(IntPtr hWnd, IntPtr hRgn, bool redraw);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool ShowCaret(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool SetCapture(IntPtr hWnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern int ShowWindow(IntPtr hWnd, short cmdShow);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int bRetValue, uint fWinINI);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool TrackMouseEvent(ref TRACKMOUSEEVENTS tme);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool TranslateMessage(ref MSG msg);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref POINT pptDst, ref SIZE psize, IntPtr hdcSrc, ref POINT pprSrc, int crKey, ref BLENDFUNCTION pblend, int dwFlags);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool UpdateWindow(IntPtr hwnd);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
internal static extern bool WaitMessage();
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool AdjustWindowRectEx(ref RECT lpRect, int dwStyle, bool bMenu, int dwExStyle);
}
internal class Gdi32
{
// Methods
private Gdi32()
{
}
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern int CombineRgn(IntPtr dest, IntPtr src1, IntPtr src2, int flags);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr CreateBrushIndirect(ref LOGBRUSH brush);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr CreateCompatibleDC(IntPtr hDC);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr CreateRectRgnIndirect(ref RECT rect);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern bool DeleteDC(IntPtr hDC);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr DeleteObject(IntPtr hObject);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern int GetClipBox(IntPtr hDC, ref RECT rectBox);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern bool PatBlt(IntPtr hDC, int x, int y, int width, int height, uint flags);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn);
[DllImport("gdi32.dll", CharSet = CharSet.Auto)]
internal static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
}
[StructLayout(LayoutKind.Sequential)]
public struct LOGBRUSH
{
public uint lbStyle;
public uint lbColor;
public uint lbHatch;
}
#endregion
}

View File

@@ -1,164 +1,53 @@
using Microsoft.Win32;
using System.Diagnostics;
using System.Management;
using System.Security.Principal;
using System.Text;
using System.Text.Json;
public class AppConfig
{
string appPath;
string configFile;
public Dictionary<string, object> config = new Dictionary<string, object>();
public AppConfig()
{
appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
configFile = appPath + "\\config.json";
if (!System.IO.Directory.Exists(appPath))
System.IO.Directory.CreateDirectory(appPath);
if (File.Exists(configFile))
{
string text = File.ReadAllText(configFile);
try
{
config = JsonSerializer.Deserialize<Dictionary<string, object>>(text);
}
catch
{
initConfig();
}
}
else
{
initConfig();
}
}
private void initConfig()
{
config = new Dictionary<string, object>();
config["performance_mode"] = 0;
string jsonString = JsonSerializer.Serialize(config);
File.WriteAllText(configFile, jsonString);
}
public int getConfig(string name)
{
if (config.ContainsKey(name))
return int.Parse(config[name].ToString());
else return -1;
}
public string getConfigString(string name)
{
if (config.ContainsKey(name))
return config[name].ToString();
else return null;
}
public void setConfig(string name, int value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(configFile, jsonString);
}
public void setConfig(string name, string value)
{
config[name] = value;
string jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(configFile, jsonString);
}
}
public class HardwareMonitor
{
public static float? cpuTemp = -1;
public static float? batteryDischarge = -1;
public float? cpuTemp = -1;
public float? gpuTemp = -1;
public float? batteryDischarge = -1;
public float? batteryCharge = -1;
public static bool IsAdministrator()
public static void ReadSensors()
{
return (new WindowsPrincipal(WindowsIdentity.GetCurrent()))
.IsInRole(WindowsBuiltInRole.Administrator);
}
public HardwareMonitor()
{
}
public void ReadSensors()
{
cpuTemp = -1;
gpuTemp = -1;
batteryDischarge = -1;
try
{
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
cpuTemp = ct.NextValue() - 273;
ct.Dispose();
if (cpuTemp < 0)
{
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
cpuTemp = ct.NextValue() - 273;
ct.Dispose();
}
if (batteryDischarge < 0)
{
var ct = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
batteryDischarge = ct.NextValue() / 1000;
ct.Dispose();
}
} catch
var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
batteryDischarge = cb.NextValue() / 1000;
cb.Dispose();
}
catch
{
Debug.WriteLine("Failed reading sensors");
}
}
public void StopReading()
{
//computer.Close();
}
}
namespace GHelper
{
static class Program
{
public static NotifyIcon trayIcon = new NotifyIcon
{
Text = "G-Helper",
Icon = Properties.Resources.standard,
Visible = true
};
{
Text = "G-Helper",
Icon = Properties.Resources.standard,
Visible = true
};
public static ASUSWmi wmi = new ASUSWmi();
public static AppConfig config = new AppConfig();
public static SettingsForm settingsForm = new SettingsForm();
public static HardwareMonitor hwmonitor = new HardwareMonitor();
public static ToastForm toast = new ToastForm();
// The main entry point for the application
public static void Main()
@@ -172,29 +61,51 @@ namespace GHelper
settingsForm.InitBoost();
settingsForm.InitAura();
settingsForm.SetPerformanceMode(config.getConfig("performance_mode"));
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
settingsForm.VisualiseGPUAuto(config.getConfig("gpu_auto"));
settingsForm.VisualiseScreenAuto(config.getConfig("screen_auto"));
settingsForm.SetStartupCheck(Startup.IsScheduled());
bool isPlugged = (System.Windows.Forms.SystemInformation.PowerStatus.PowerLineStatus == PowerLineStatus.Online);
settingsForm.AutoGPUMode(isPlugged ? 1 : 0);
settingsForm.AutoScreen(isPlugged ? 1 : 0);
SetAutoModes();
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
IntPtr dummy = settingsForm.Handle;
IntPtr ds = settingsForm.Handle;
Application.Run();
}
private static void SetAutoModes()
{
PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
settingsForm.AutoGPUMode(isPlugged);
settingsForm.AutoScreen(isPlugged);
settingsForm.AutoPerformance(isPlugged);
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
}
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
SetAutoModes();
}
static void LaunchProcess(string fileName = "")
{
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = fileName;
start.WindowStyle = ProcessWindowStyle.Hidden;
start.CreateNoWindow = true;
try
{
Process proc = Process.Start(start);
}
catch
{
Debug.WriteLine("Failed to run " + fileName);
}
}
static void WatcherEventArrived(object sender, EventArrivedEventArgs e)
@@ -209,14 +120,39 @@ namespace GHelper
switch (EventID)
{
case 56: // Rog button
case 174: // FN+F5
settingsForm.BeginInvoke(delegate
case 124: // M3
switch (config.getConfig("m3"))
{
settingsForm.CyclePerformanceMode();
});
case 1:
NativeMethods.KeyPress(NativeMethods.VK_MEDIA_PLAY_PAUSE);
break;
case 2:
settingsForm.BeginInvoke(settingsForm.CycleAuraMode);
break;
case 3:
LaunchProcess(config.getConfigString("m3_custom"));
break;
default:
NativeMethods.KeyPress(NativeMethods.VK_VOLUME_MUTE);
break;
}
return;
case 56: // M4 / Rog button
switch (config.getConfig("m4"))
{
case 1:
settingsForm.BeginInvoke(SettingsToggle);
break;
case 2:
LaunchProcess(config.getConfigString("m4_custom"));
break;
default:
settingsForm.BeginInvoke(settingsForm.CyclePerformanceMode);
break;
}
return;
case 174: // FN+F5
settingsForm.BeginInvoke(settingsForm.CyclePerformanceMode);
return;
case 179: // FN+F4
settingsForm.BeginInvoke(delegate
@@ -225,18 +161,22 @@ namespace GHelper
});
return;
case 87: // Battery
/*
settingsForm.BeginInvoke(delegate
{
settingsForm.AutoGPUMode(0);
settingsForm.AutoScreen(0);
});
*/
return;
case 88: // Plugged
/*
settingsForm.BeginInvoke(delegate
{
settingsForm.AutoGPUMode(1);
settingsForm.AutoScreen(1);
settingsForm.AutoGPUMode(1);
});
*/
return;
}
@@ -244,19 +184,25 @@ namespace GHelper
}
static void SettingsToggle()
{
if (settingsForm.Visible)
settingsForm.Hide();
else
{
settingsForm.Show();
settingsForm.Activate();
}
settingsForm.VisualiseGPUMode();
}
static void TrayIcon_MouseClick(object? sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right)
{
if (settingsForm.Visible)
settingsForm.Hide();
else
{
settingsForm.Show();
settingsForm.Activate();
}
trayIcon.Icon = trayIcon.Icon; // refreshing icon as it get's blurred when screen resolution changes
SettingsToggle();
}
}

View File

@@ -70,6 +70,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap everything_is_fine_itsfine {
get {
object obj = ResourceManager.GetObject("everything-is-fine-itsfine", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@@ -80,6 +90,16 @@ namespace GHelper.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap icons8_fan_head_96 {
get {
object obj = ResourceManager.GetObject("icons8-fan-head-96", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>

View File

@@ -133,16 +133,22 @@
<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="icons8-speed-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-speed-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-video-card-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-video-card-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-fan-head-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-fan-head-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-charging-battery-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-charging-battery-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-laptop-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-laptop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="icons8-speed-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\icons8-speed-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<data name="everything-is-fine-itsfine" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\everything-is-fine-itsfine.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

View File

@@ -1,10 +1,32 @@
# G-Helper (For G14, G15, ROG FLOW, and others)
A tiny system tray utility that allows you set performance and GPU profiles for your laptop. Same as ASUS Armory Crate does but without it completely!.
A small utility that allows you do almost everyting you could do with Armory Crate but without extra bloat and unnecessary services.
Designed 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.
### NEW! Experimental feature: **Set Power limits (PPT) - Total and CPU**.
![Screenshot](https://github.com/seerge/g14-helper/blob/main/screenshot.png)
1. Switch between default **Performance modes** - Silent / Balanced / Turbo and apply default fan curves
2. Switch between Eco / Standard or Ultimate **GPU modes**
3. Change laptop screen refresh rate - 60hz or your maximum (120hz, 144hz, etc depending on the model) with display overdrive (OD)
4. View default fan profiles for every mode and **auto apply** custom ones
5. Control keyboard backlit animation and colors
6. Set battery charge limit to preserve battery
7. Monitor CPU temperature, fan speeds and battery discharge rate
8. **Automatically switch to Eco(iGPU)/60hz on battery** and back to Standard(GPU)/120hz modes when plugged
9. Support for M4 key / FN+F5 to cycle through performance modes (with OSD notification) and FN+F4 to cycle through keeyboard animation modes
10. Basic keybindings for M3 and M4 keys
11. Turn cpu turbo boost on/off with one checkbox to keep temps cooler
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.
To keep autoswitching and hotkeys work app needs to stay in running in tray. It doesn't consume any resources.
I also recommend to keep "Asus Optimization Service" running, as it keeps basic laptop hotkeys such as screen or keyboard brightness adjustment working. If you have (or had) MyASUS app installed, that service is most probably still up an running even after MyASUS uninstall.
It's part of [Asus System Controll Interface](https://www.asus.com/support/FAQ/1047338/). You can install it, and later disable / remove unnecesarily services by running [this bat file](https://raw.githubusercontent.com/seerge/g-helper/main/stop-asus-sv.bat ) as admin.
### [Download latest release](https://github.com/seerge/g-helper/releases)
![Screenshot](https://github.com/seerge/g-helper/blob/main/screenshot.png)
## Performance Profile switching
@@ -14,23 +36,13 @@ Profiles are **same** as in Armory Crate, including default fan curves
2. Balanced (balanced fans, 100W PPT total, up to 45W PPT to CPU)
3. Turbo (intense fans, 125W PPT total, up to 80W PPT to CPU)
## GPU Mode switching
PPTs are shown for G14 2022, for other models PPTs will be different as they are set in bios.
1. Eco mode : only low power iGPU (Radeon 680u) enabled, iGPU drives built in display
2. Standard mode (Windows Hybrid) : iGPU and dGPU (Radeon 6700s/6800s) enabled, iGPU drives built in display
3. Ultimate mode: iGPU and dGPU enabled, but dGPU drives built in display
4. **Custom fan profiles** for any mode!
## GPU Modes
## Extras
1. Keyboard backlight control (basic aura modes and colors)
2. **Maximum battery charge rate** limit (60% / 80% / 100%) to preserve your battery
3. CPU and GPU relative fan speed monitoring
4. Automatic switching of Standard/Eco GPU modes when laptop is plugged / unplugged!
5. FN+F5 an M4 (Rog) keys cycle through Performance modes
6. Screen resolution and display overdrive switching
7. CPU turbo boost switching
8. CPU & dGPU temperature monitoring in Celsius, battery charge / discharge rates in Watts
1. Eco mode : only low power integrated GPU enabled, iGPU drives built in display
2. Standard mode (Windows Hybrid) : iGPU and dGPU enabled, iGPU drives built in display
3. Ultimate mode: iGPU and dGPU enabled, but dGPU drives built in display (supported only on G14 2022 model)
## Things still missing
@@ -38,7 +50,7 @@ Profiles are **same** as in Armory Crate, including default fan curves
## How to install
1. Download latest release from https://github.com/seerge/g14-helper/releases
1. Download latest release from https://github.com/seerge/g-helper/releases
2. Unzip to a folder of your choice
3. Run **GHelper.exe**
@@ -48,8 +60,13 @@ Doesn't require administrator privileges to run (anymore)!
I don`t have Microsoft certificate to sign app yet, so if you set a warning from Windows Defender on launch (Windows Protected your PC), click More Info -> Run anyway.
Alternatively you can comile and run project by yourself :)
Settings file is storer at %AppData%\GHelper
P.S.: It's not recommended to use app in combination with Armory Crate, cause they adjust same settings.
Please keep in mind, that if you also run MyASUS app periodically it will also try to adjust same battery charge settings
------------------
Debloating helps to save your battery and keep laptop a bit cooler
![Helps to save your battery](https://raw.githubusercontent.com/seerge/g-helper/main/screenshots/screen-5w.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

281
Settings.Designer.cs generated
View File

@@ -62,6 +62,10 @@
buttonKeyboardColor = new Button();
labelBattery = new Label();
buttonFans = new Button();
buttonKeyboard = new Button();
pictureColor = new PictureBox();
pictureColor2 = new PictureBox();
labelVersion = new Label();
((System.ComponentModel.ISupportInitialize)trackBattery).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBattery).BeginInit();
tableGPU.SuspendLayout();
@@ -71,15 +75,17 @@
((System.ComponentModel.ISupportInitialize)pictureScreen).BeginInit();
tableScreen.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureColor).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureColor2).BeginInit();
SuspendLayout();
//
// checkStartup
//
checkStartup.AutoSize = true;
checkStartup.Location = new Point(20, 508);
checkStartup.Margin = new Padding(2, 1, 2, 1);
checkStartup.Location = new Point(33, 1016);
checkStartup.Margin = new Padding(4, 2, 4, 2);
checkStartup.Name = "checkStartup";
checkStartup.Size = new Size(105, 19);
checkStartup.Size = new Size(206, 36);
checkStartup.TabIndex = 2;
checkStartup.Text = "Run on Startup";
checkStartup.UseVisualStyleBackColor = true;
@@ -89,12 +95,12 @@
//
trackBattery.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
trackBattery.LargeChange = 20;
trackBattery.Location = new Point(10, 454);
trackBattery.Margin = new Padding(2, 1, 2, 1);
trackBattery.Location = new Point(20, 908);
trackBattery.Margin = new Padding(4, 2, 4, 2);
trackBattery.Maximum = 100;
trackBattery.Minimum = 50;
trackBattery.Name = "trackBattery";
trackBattery.Size = new Size(338, 45);
trackBattery.Size = new Size(676, 90);
trackBattery.SmallChange = 10;
trackBattery.TabIndex = 3;
trackBattery.TickFrequency = 10;
@@ -105,10 +111,10 @@
//
labelBatteryTitle.AutoSize = true;
labelBatteryTitle.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelBatteryTitle.Location = new Point(38, 435);
labelBatteryTitle.Margin = new Padding(2, 0, 2, 0);
labelBatteryTitle.Location = new Point(78, 870);
labelBatteryTitle.Margin = new Padding(4, 0, 4, 0);
labelBatteryTitle.Name = "labelBatteryTitle";
labelBatteryTitle.Size = new Size(122, 15);
labelBatteryTitle.Size = new Size(248, 32);
labelBatteryTitle.TabIndex = 4;
labelBatteryTitle.Text = "Battery Charge Limit";
//
@@ -116,22 +122,22 @@
//
pictureBattery.BackgroundImage = (Image)resources.GetObject("pictureBattery.BackgroundImage");
pictureBattery.BackgroundImageLayout = ImageLayout.Zoom;
pictureBattery.Location = new Point(16, 434);
pictureBattery.Margin = new Padding(2, 1, 2, 1);
pictureBattery.Location = new Point(36, 868);
pictureBattery.Margin = new Padding(4, 2, 4, 2);
pictureBattery.Name = "pictureBattery";
pictureBattery.Size = new Size(18, 19);
pictureBattery.Size = new Size(36, 38);
pictureBattery.TabIndex = 6;
pictureBattery.TabStop = false;
//
// labelGPUFan
//
labelGPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelGPUFan.Location = new Point(205, 131);
labelGPUFan.Margin = new Padding(2, 0, 2, 0);
labelGPUFan.Location = new Point(338, 262);
labelGPUFan.Margin = new Padding(4, 0, 4, 0);
labelGPUFan.Name = "labelGPUFan";
labelGPUFan.Size = new Size(138, 16);
labelGPUFan.Size = new Size(348, 32);
labelGPUFan.TabIndex = 8;
labelGPUFan.Text = "GPU Fan : 0%";
labelGPUFan.Text = "GPU Fan";
labelGPUFan.TextAlign = ContentAlignment.TopRight;
//
// tableGPU
@@ -144,12 +150,12 @@
tableGPU.Controls.Add(buttonUltimate, 2, 0);
tableGPU.Controls.Add(buttonStandard, 1, 0);
tableGPU.Controls.Add(buttonEco, 0, 0);
tableGPU.Location = new Point(11, 152);
tableGPU.Margin = new Padding(2, 1, 2, 1);
tableGPU.Location = new Point(22, 304);
tableGPU.Margin = new Padding(4, 2, 4, 2);
tableGPU.Name = "tableGPU";
tableGPU.RowCount = 1;
tableGPU.RowStyles.Add(new RowStyle(SizeType.Absolute, 54F));
tableGPU.Size = new Size(338, 54);
tableGPU.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tableGPU.Size = new Size(676, 108);
tableGPU.TabIndex = 7;
//
// buttonUltimate
@@ -158,10 +164,10 @@
buttonUltimate.Dock = DockStyle.Fill;
buttonUltimate.FlatAppearance.BorderSize = 0;
buttonUltimate.FlatStyle = FlatStyle.Flat;
buttonUltimate.Location = new Point(228, 6);
buttonUltimate.Margin = new Padding(4, 6, 4, 6);
buttonUltimate.Location = new Point(458, 12);
buttonUltimate.Margin = new Padding(8, 12, 8, 12);
buttonUltimate.Name = "buttonUltimate";
buttonUltimate.Size = new Size(106, 42);
buttonUltimate.Size = new Size(210, 84);
buttonUltimate.TabIndex = 2;
buttonUltimate.Text = "Ultimate";
buttonUltimate.UseVisualStyleBackColor = false;
@@ -172,10 +178,10 @@
buttonStandard.Dock = DockStyle.Fill;
buttonStandard.FlatAppearance.BorderSize = 0;
buttonStandard.FlatStyle = FlatStyle.Flat;
buttonStandard.Location = new Point(116, 6);
buttonStandard.Margin = new Padding(4, 6, 4, 6);
buttonStandard.Location = new Point(233, 12);
buttonStandard.Margin = new Padding(8, 12, 8, 12);
buttonStandard.Name = "buttonStandard";
buttonStandard.Size = new Size(104, 42);
buttonStandard.Size = new Size(209, 84);
buttonStandard.TabIndex = 1;
buttonStandard.Text = "Standard";
buttonStandard.UseVisualStyleBackColor = false;
@@ -187,10 +193,10 @@
buttonEco.Dock = DockStyle.Fill;
buttonEco.FlatAppearance.BorderSize = 0;
buttonEco.FlatStyle = FlatStyle.Flat;
buttonEco.Location = new Point(4, 6);
buttonEco.Margin = new Padding(4, 6, 4, 6);
buttonEco.Location = new Point(8, 12);
buttonEco.Margin = new Padding(8, 12, 8, 12);
buttonEco.Name = "buttonEco";
buttonEco.Size = new Size(104, 42);
buttonEco.Size = new Size(209, 84);
buttonEco.TabIndex = 0;
buttonEco.Text = "Eco";
buttonEco.UseVisualStyleBackColor = false;
@@ -199,10 +205,10 @@
//
labelGPU.AutoSize = true;
labelGPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelGPU.Location = new Point(38, 132);
labelGPU.Margin = new Padding(2, 0, 2, 0);
labelGPU.Location = new Point(78, 264);
labelGPU.Margin = new Padding(4, 0, 4, 0);
labelGPU.Name = "labelGPU";
labelGPU.Size = new Size(67, 15);
labelGPU.Size = new Size(136, 32);
labelGPU.TabIndex = 9;
labelGPU.Text = "GPU Mode";
//
@@ -210,22 +216,22 @@
//
pictureGPU.BackgroundImage = (Image)resources.GetObject("pictureGPU.BackgroundImage");
pictureGPU.BackgroundImageLayout = ImageLayout.Zoom;
pictureGPU.Location = new Point(16, 131);
pictureGPU.Margin = new Padding(2, 1, 2, 1);
pictureGPU.Location = new Point(36, 262);
pictureGPU.Margin = new Padding(4, 2, 4, 2);
pictureGPU.Name = "pictureGPU";
pictureGPU.Size = new Size(18, 19);
pictureGPU.Size = new Size(36, 38);
pictureGPU.TabIndex = 10;
pictureGPU.TabStop = false;
//
// labelCPUFan
//
labelCPUFan.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelCPUFan.Location = new Point(205, 19);
labelCPUFan.Margin = new Padding(2, 0, 2, 0);
labelCPUFan.Location = new Point(320, 38);
labelCPUFan.Margin = new Padding(4, 0, 4, 0);
labelCPUFan.Name = "labelCPUFan";
labelCPUFan.Size = new Size(138, 16);
labelCPUFan.Size = new Size(366, 32);
labelCPUFan.TabIndex = 12;
labelCPUFan.Text = "CPU Fan : 0%";
labelCPUFan.Text = "CPU Fan";
labelCPUFan.TextAlign = ContentAlignment.TopRight;
//
// tablePerf
@@ -238,12 +244,12 @@
tablePerf.Controls.Add(buttonTurbo, 2, 0);
tablePerf.Controls.Add(buttonBalanced, 1, 0);
tablePerf.Controls.Add(buttonSilent, 0, 0);
tablePerf.Location = new Point(11, 38);
tablePerf.Margin = new Padding(2, 1, 2, 1);
tablePerf.Location = new Point(22, 76);
tablePerf.Margin = new Padding(4, 2, 4, 2);
tablePerf.Name = "tablePerf";
tablePerf.RowCount = 1;
tablePerf.RowStyles.Add(new RowStyle(SizeType.Absolute, 54F));
tablePerf.Size = new Size(338, 54);
tablePerf.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tablePerf.Size = new Size(676, 108);
tablePerf.TabIndex = 11;
//
// buttonTurbo
@@ -253,10 +259,10 @@
buttonTurbo.FlatAppearance.BorderColor = Color.FromArgb(192, 0, 0);
buttonTurbo.FlatAppearance.BorderSize = 0;
buttonTurbo.FlatStyle = FlatStyle.Flat;
buttonTurbo.Location = new Point(228, 6);
buttonTurbo.Margin = new Padding(4, 6, 4, 6);
buttonTurbo.Location = new Point(458, 12);
buttonTurbo.Margin = new Padding(8, 12, 8, 12);
buttonTurbo.Name = "buttonTurbo";
buttonTurbo.Size = new Size(106, 42);
buttonTurbo.Size = new Size(210, 84);
buttonTurbo.TabIndex = 2;
buttonTurbo.Text = "Turbo";
buttonTurbo.UseVisualStyleBackColor = false;
@@ -268,10 +274,10 @@
buttonBalanced.FlatAppearance.BorderColor = Color.FromArgb(0, 0, 192);
buttonBalanced.FlatAppearance.BorderSize = 0;
buttonBalanced.FlatStyle = FlatStyle.Flat;
buttonBalanced.Location = new Point(116, 6);
buttonBalanced.Margin = new Padding(4, 6, 4, 6);
buttonBalanced.Location = new Point(233, 12);
buttonBalanced.Margin = new Padding(8, 12, 8, 12);
buttonBalanced.Name = "buttonBalanced";
buttonBalanced.Size = new Size(104, 42);
buttonBalanced.Size = new Size(209, 84);
buttonBalanced.TabIndex = 1;
buttonBalanced.Text = "Balanced";
buttonBalanced.UseVisualStyleBackColor = false;
@@ -284,10 +290,10 @@
buttonSilent.FlatAppearance.BorderColor = Color.FromArgb(0, 192, 192);
buttonSilent.FlatAppearance.BorderSize = 0;
buttonSilent.FlatStyle = FlatStyle.Flat;
buttonSilent.Location = new Point(4, 6);
buttonSilent.Margin = new Padding(4, 6, 4, 6);
buttonSilent.Location = new Point(8, 12);
buttonSilent.Margin = new Padding(8, 12, 8, 12);
buttonSilent.Name = "buttonSilent";
buttonSilent.Size = new Size(104, 42);
buttonSilent.Size = new Size(209, 84);
buttonSilent.TabIndex = 0;
buttonSilent.Text = "Silent";
buttonSilent.UseVisualStyleBackColor = false;
@@ -297,10 +303,10 @@
picturePerf.BackgroundImage = (Image)resources.GetObject("picturePerf.BackgroundImage");
picturePerf.BackgroundImageLayout = ImageLayout.Zoom;
picturePerf.InitialImage = null;
picturePerf.Location = new Point(16, 18);
picturePerf.Margin = new Padding(2, 1, 2, 1);
picturePerf.Location = new Point(36, 36);
picturePerf.Margin = new Padding(4, 2, 4, 2);
picturePerf.Name = "picturePerf";
picturePerf.Size = new Size(18, 19);
picturePerf.Size = new Size(36, 38);
picturePerf.TabIndex = 14;
picturePerf.TabStop = false;
//
@@ -308,10 +314,10 @@
//
labelPerf.AutoSize = true;
labelPerf.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelPerf.Location = new Point(38, 19);
labelPerf.Margin = new Padding(2, 0, 2, 0);
labelPerf.Location = new Point(78, 38);
labelPerf.Margin = new Padding(4, 0, 4, 0);
labelPerf.Name = "labelPerf";
labelPerf.Size = new Size(115, 15);
labelPerf.Size = new Size(234, 32);
labelPerf.TabIndex = 13;
labelPerf.Text = "Performance Mode";
//
@@ -319,10 +325,10 @@
//
checkGPU.AutoSize = true;
checkGPU.ForeColor = SystemColors.GrayText;
checkGPU.Location = new Point(16, 206);
checkGPU.Margin = new Padding(2, 1, 2, 1);
checkGPU.Location = new Point(32, 412);
checkGPU.Margin = new Padding(4, 2, 4, 2);
checkGPU.Name = "checkGPU";
checkGPU.Size = new Size(273, 19);
checkGPU.Size = new Size(550, 36);
checkGPU.TabIndex = 15;
checkGPU.Text = "Set Eco on battery and Standard when plugged";
checkGPU.UseVisualStyleBackColor = true;
@@ -332,10 +338,10 @@
//
buttonQuit.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonQuit.BackColor = SystemColors.ButtonFace;
buttonQuit.Location = new Point(288, 504);
buttonQuit.Margin = new Padding(2, 1, 2, 1);
buttonQuit.Location = new Point(576, 1008);
buttonQuit.Margin = new Padding(4, 2, 4, 2);
buttonQuit.Name = "buttonQuit";
buttonQuit.Size = new Size(60, 24);
buttonQuit.Size = new Size(120, 48);
buttonQuit.TabIndex = 16;
buttonQuit.Text = "Quit";
buttonQuit.UseVisualStyleBackColor = false;
@@ -344,10 +350,10 @@
//
pictureScreen.BackgroundImage = (Image)resources.GetObject("pictureScreen.BackgroundImage");
pictureScreen.BackgroundImageLayout = ImageLayout.Zoom;
pictureScreen.Location = new Point(16, 248);
pictureScreen.Margin = new Padding(2, 1, 2, 1);
pictureScreen.Location = new Point(36, 496);
pictureScreen.Margin = new Padding(4, 2, 4, 2);
pictureScreen.Name = "pictureScreen";
pictureScreen.Size = new Size(18, 19);
pictureScreen.Size = new Size(36, 38);
pictureScreen.TabIndex = 18;
pictureScreen.TabStop = false;
//
@@ -355,10 +361,10 @@
//
labelSreen.AutoSize = true;
labelSreen.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
labelSreen.Location = new Point(38, 248);
labelSreen.Margin = new Padding(2, 0, 2, 0);
labelSreen.Location = new Point(78, 496);
labelSreen.Margin = new Padding(4, 0, 4, 0);
labelSreen.Name = "labelSreen";
labelSreen.Size = new Size(87, 15);
labelSreen.Size = new Size(176, 32);
labelSreen.TabIndex = 17;
labelSreen.Text = "Laptop Screen";
//
@@ -371,12 +377,12 @@
tableScreen.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 33.33333F));
tableScreen.Controls.Add(button120Hz, 1, 0);
tableScreen.Controls.Add(button60Hz, 0, 0);
tableScreen.Location = new Point(11, 268);
tableScreen.Margin = new Padding(2, 1, 2, 1);
tableScreen.Location = new Point(22, 536);
tableScreen.Margin = new Padding(4, 2, 4, 2);
tableScreen.Name = "tableScreen";
tableScreen.RowCount = 1;
tableScreen.RowStyles.Add(new RowStyle(SizeType.Absolute, 54F));
tableScreen.Size = new Size(338, 54);
tableScreen.RowStyles.Add(new RowStyle(SizeType.Absolute, 108F));
tableScreen.Size = new Size(676, 108);
tableScreen.TabIndex = 19;
//
// button120Hz
@@ -386,10 +392,10 @@
button120Hz.FlatAppearance.BorderColor = SystemColors.ActiveBorder;
button120Hz.FlatAppearance.BorderSize = 0;
button120Hz.FlatStyle = FlatStyle.Flat;
button120Hz.Location = new Point(116, 6);
button120Hz.Margin = new Padding(4, 6, 4, 6);
button120Hz.Location = new Point(233, 12);
button120Hz.Margin = new Padding(8, 12, 8, 12);
button120Hz.Name = "button120Hz";
button120Hz.Size = new Size(104, 42);
button120Hz.Size = new Size(209, 84);
button120Hz.TabIndex = 1;
button120Hz.Text = "120Hz + OD";
button120Hz.UseVisualStyleBackColor = false;
@@ -403,10 +409,10 @@
button60Hz.FlatAppearance.BorderSize = 0;
button60Hz.FlatStyle = FlatStyle.Flat;
button60Hz.ForeColor = SystemColors.ControlText;
button60Hz.Location = new Point(4, 6);
button60Hz.Margin = new Padding(4, 6, 4, 6);
button60Hz.Location = new Point(8, 12);
button60Hz.Margin = new Padding(8, 12, 8, 12);
button60Hz.Name = "button60Hz";
button60Hz.Size = new Size(104, 42);
button60Hz.Size = new Size(209, 84);
button60Hz.TabIndex = 0;
button60Hz.Text = "60Hz";
button60Hz.UseVisualStyleBackColor = false;
@@ -415,10 +421,10 @@
//
checkScreen.AutoSize = true;
checkScreen.ForeColor = SystemColors.GrayText;
checkScreen.Location = new Point(16, 322);
checkScreen.Margin = new Padding(2, 1, 2, 1);
checkScreen.Location = new Point(32, 644);
checkScreen.Margin = new Padding(4, 2, 4, 2);
checkScreen.Name = "checkScreen";
checkScreen.Size = new Size(261, 19);
checkScreen.Size = new Size(527, 36);
checkScreen.TabIndex = 20;
checkScreen.Text = "Set 60Hz on battery, and back when plugged";
checkScreen.UseVisualStyleBackColor = true;
@@ -427,10 +433,10 @@
//
checkBoost.AutoSize = true;
checkBoost.ForeColor = SystemColors.GrayText;
checkBoost.Location = new Point(16, 92);
checkBoost.Margin = new Padding(2, 1, 2, 1);
checkBoost.Location = new Point(32, 184);
checkBoost.Margin = new Padding(4, 2, 4, 2);
checkBoost.Name = "checkBoost";
checkBoost.Size = new Size(161, 19);
checkBoost.Size = new Size(320, 36);
checkBoost.TabIndex = 21;
checkBoost.Text = "CPU Turbo Boost enabled";
checkBoost.UseVisualStyleBackColor = true;
@@ -439,10 +445,10 @@
//
pictureBox1.BackgroundImage = Properties.Resources.icons8_keyboard_48;
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
pictureBox1.Location = new Point(16, 362);
pictureBox1.Margin = new Padding(2, 1, 2, 1);
pictureBox1.Location = new Point(36, 724);
pictureBox1.Margin = new Padding(4, 2, 4, 2);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(18, 18);
pictureBox1.Size = new Size(36, 36);
pictureBox1.TabIndex = 23;
pictureBox1.TabStop = false;
//
@@ -450,24 +456,23 @@
//
label1.AutoSize = true;
label1.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
label1.Location = new Point(38, 362);
label1.Margin = new Padding(2, 0, 2, 0);
label1.Location = new Point(78, 724);
label1.Margin = new Padding(4, 0, 4, 0);
label1.Name = "label1";
label1.Size = new Size(101, 15);
label1.Size = new Size(210, 32);
label1.TabIndex = 22;
label1.Text = "Laptop Keyboard";
//
// comboKeyboard
//
comboKeyboard.FlatStyle = FlatStyle.Flat;
comboKeyboard.Font = new Font("Segoe UI", 10F, FontStyle.Regular, GraphicsUnit.Point);
comboKeyboard.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
comboKeyboard.FormattingEnabled = true;
comboKeyboard.ItemHeight = 17;
comboKeyboard.Items.AddRange(new object[] { "Static", "Breathe", "Strobe", "Rainbow" });
comboKeyboard.Location = new Point(18, 388);
comboKeyboard.ItemHeight = 32;
comboKeyboard.Items.AddRange(new object[] { "Static", "Breathe", "Strobe", "Rainbow", "Dingding" });
comboKeyboard.Location = new Point(32, 778);
comboKeyboard.Margin = new Padding(0);
comboKeyboard.Name = "comboKeyboard";
comboKeyboard.Size = new Size(102, 25);
comboKeyboard.Size = new Size(200, 40);
comboKeyboard.TabIndex = 24;
comboKeyboard.TabStop = false;
//
@@ -477,23 +482,22 @@
buttonKeyboardColor.BackColor = SystemColors.ButtonHighlight;
buttonKeyboardColor.FlatAppearance.BorderColor = Color.Red;
buttonKeyboardColor.FlatAppearance.BorderSize = 2;
buttonKeyboardColor.FlatStyle = FlatStyle.Flat;
buttonKeyboardColor.ForeColor = SystemColors.ControlText;
buttonKeyboardColor.Location = new Point(128, 388);
buttonKeyboardColor.Location = new Point(255, 774);
buttonKeyboardColor.Margin = new Padding(0);
buttonKeyboardColor.Name = "buttonKeyboardColor";
buttonKeyboardColor.Size = new Size(106, 29);
buttonKeyboardColor.Size = new Size(209, 48);
buttonKeyboardColor.TabIndex = 25;
buttonKeyboardColor.Text = "Color";
buttonKeyboardColor.Text = "Color ";
buttonKeyboardColor.UseVisualStyleBackColor = false;
//
// labelBattery
//
labelBattery.Anchor = AnchorStyles.Top | AnchorStyles.Right;
labelBattery.Location = new Point(205, 434);
labelBattery.Margin = new Padding(2, 0, 2, 0);
labelBattery.Location = new Point(410, 868);
labelBattery.Margin = new Padding(4, 0, 4, 0);
labelBattery.Name = "labelBattery";
labelBattery.Size = new Size(138, 16);
labelBattery.Size = new Size(276, 32);
labelBattery.TabIndex = 27;
labelBattery.Text = " ";
labelBattery.TextAlign = ContentAlignment.TopRight;
@@ -502,19 +506,64 @@
//
buttonFans.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonFans.BackColor = SystemColors.ButtonFace;
buttonFans.Location = new Point(263, 93);
buttonFans.Margin = new Padding(2, 1, 2, 1);
buttonFans.FlatAppearance.BorderSize = 0;
buttonFans.Location = new Point(480, 186);
buttonFans.Margin = new Padding(4, 2, 4, 2);
buttonFans.Name = "buttonFans";
buttonFans.Size = new Size(82, 24);
buttonFans.Size = new Size(210, 48);
buttonFans.TabIndex = 28;
buttonFans.Text = "Fan Profile";
buttonFans.Text = "Fans and Power";
buttonFans.UseVisualStyleBackColor = false;
//
// buttonKeyboard
//
buttonKeyboard.Anchor = AnchorStyles.Top | AnchorStyles.Right;
buttonKeyboard.BackColor = SystemColors.ButtonFace;
buttonKeyboard.FlatAppearance.BorderSize = 0;
buttonKeyboard.Location = new Point(480, 773);
buttonKeyboard.Margin = new Padding(4, 2, 4, 2);
buttonKeyboard.Name = "buttonKeyboard";
buttonKeyboard.Size = new Size(209, 48);
buttonKeyboard.TabIndex = 29;
buttonKeyboard.Text = "Extra";
buttonKeyboard.UseVisualStyleBackColor = false;
//
// pictureColor
//
pictureColor.Location = new Point(431, 789);
pictureColor.Name = "pictureColor";
pictureColor.Size = new Size(20, 20);
pictureColor.TabIndex = 30;
pictureColor.TabStop = false;
//
// pictureColor2
//
pictureColor2.Location = new Point(405, 789);
pictureColor2.Name = "pictureColor2";
pictureColor2.Size = new Size(20, 20);
pictureColor2.TabIndex = 31;
pictureColor2.TabStop = false;
//
// labelVersion
//
labelVersion.AutoSize = true;
labelVersion.Font = new Font("Segoe UI", 9F, FontStyle.Underline, GraphicsUnit.Point);
labelVersion.ForeColor = SystemColors.ControlDark;
labelVersion.Location = new Point(34, 966);
labelVersion.Name = "labelVersion";
labelVersion.Size = new Size(44, 32);
labelVersion.TabIndex = 32;
labelVersion.Text = "v.0";
//
// SettingsForm
//
AutoScaleDimensions = new SizeF(96F, 96F);
AutoScaleDimensions = new SizeF(192F, 192F);
AutoScaleMode = AutoScaleMode.Dpi;
ClientSize = new Size(365, 543);
ClientSize = new Size(730, 1089);
Controls.Add(labelVersion);
Controls.Add(pictureColor2);
Controls.Add(pictureColor);
Controls.Add(buttonKeyboard);
Controls.Add(buttonFans);
Controls.Add(labelBattery);
Controls.Add(buttonKeyboardColor);
@@ -541,12 +590,12 @@
Controls.Add(trackBattery);
Controls.Add(checkStartup);
FormBorderStyle = FormBorderStyle.FixedSingle;
Margin = new Padding(2, 1, 2, 1);
Margin = new Padding(4, 2, 4, 2);
MaximizeBox = false;
MdiChildrenMinimizedAnchorBottom = false;
MinimizeBox = false;
Name = "SettingsForm";
Padding = new Padding(4, 6, 4, 6);
Padding = new Padding(8, 12, 8, 12);
ShowIcon = false;
StartPosition = FormStartPosition.CenterScreen;
Text = "G-Helper";
@@ -560,6 +609,8 @@
((System.ComponentModel.ISupportInitialize)pictureScreen).EndInit();
tableScreen.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
((System.ComponentModel.ISupportInitialize)pictureColor).EndInit();
((System.ComponentModel.ISupportInitialize)pictureColor2).EndInit();
ResumeLayout(false);
PerformLayout();
}
@@ -598,5 +649,9 @@
private Button buttonKeyboardColor;
private Label labelBattery;
private Button buttonFans;
private Button buttonKeyboard;
private PictureBox pictureColor;
private PictureBox pictureColor2;
private Label labelVersion;
}
}

View File

@@ -1,7 +1,8 @@
using System.Diagnostics;
using System.Reflection;
using System.Security.Cryptography;
using System.Timers;
namespace GHelper
{
@@ -17,9 +18,10 @@ namespace GHelper
static System.Timers.Timer aTimer = default!;
public string perfName;
public string perfName = "Balanced";
Fans fans;
Keyboard keyb;
public SettingsForm()
{
@@ -65,6 +67,16 @@ namespace GHelper
buttonKeyboardColor.Click += ButtonKeyboardColor_Click;
buttonFans.Click += ButtonFans_Click;
buttonKeyboard.Click += ButtonKeyboard_Click;
pictureColor.Click += PictureColor_Click;
pictureColor2.Click += PictureColor2_Click;
labelVersion.Text = "Version " + Assembly.GetExecutingAssembly().GetName().Version.ToString();
labelVersion.Click += LabelVersion_Click;
labelCPUFan.Click += LabelCPUFan_Click;
labelGPUFan.Click += LabelCPUFan_Click;
SetTimer();
@@ -72,18 +84,66 @@ namespace GHelper
}
private void LabelCPUFan_Click(object? sender, EventArgs e)
{
Program.config.setConfig("fan_rpm", (Program.config.getConfig("fan_rpm") == 1) ? 0 : 1);
RefreshSensors();
}
private void LabelVersion_Click(object? sender, EventArgs e)
{
Process.Start(new ProcessStartInfo("http://github.com/seerge/g-helper/releases") { UseShellExecute = true });
}
private void PictureColor2_Click(object? sender, EventArgs e)
{
ColorDialog colorDlg = new ColorDialog();
colorDlg.AllowFullOpen = false;
colorDlg.Color = pictureColor2.BackColor;
if (colorDlg.ShowDialog() == DialogResult.OK)
{
SetAuraColor(color2: colorDlg.Color);
}
}
private void PictureColor_Click(object? sender, EventArgs e)
{
buttonKeyboardColor.PerformClick();
}
private void ButtonKeyboard_Click(object? sender, EventArgs e)
{
if (keyb == null || keyb.Text == "")
{
keyb = new Keyboard();
keyb.Show();
}
else
{
keyb.Close();
}
}
private void ButtonFans_Click(object? sender, EventArgs e)
{
if (fans == null || fans.Text == "")
{
fans = new Fans();
fans.Show();
Debug.WriteLine("Starting fans");
}
if (fans.Visible)
{
fans.Hide();
}
else
{
fans.Close();
fans.Show();
}
}
private void ButtonKeyboardColor_Click(object? sender, EventArgs e)
@@ -96,11 +156,11 @@ namespace GHelper
ColorDialog colorDlg = new ColorDialog();
colorDlg.AllowFullOpen = false;
colorDlg.Color = but.FlatAppearance.BorderColor;
colorDlg.Color = pictureColor.BackColor;
if (colorDlg.ShowDialog() == DialogResult.OK)
{
SetAuraColor(colorDlg.Color);
SetAuraColor(color1: colorDlg.Color);
}
}
@@ -108,9 +168,12 @@ namespace GHelper
{
int mode = Program.config.getConfig("aura_mode");
int colorCode = Program.config.getConfig("aura_color");
int colorCode2 = Program.config.getConfig("aura_color2");
int speed = Program.config.getConfig("aura_speed");
Color color = Color.FromArgb(255, 255, 255);
Color color2 = Color.FromArgb(0, 0, 0);
if (mode == -1)
mode = 0;
@@ -118,8 +181,10 @@ namespace GHelper
if (colorCode != -1)
color = Color.FromArgb(colorCode);
if (colorCode2 != -1)
color2 = Color.FromArgb(colorCode2);
SetAuraColor(color, false);
SetAuraColor(color, color2, false);
SetAuraMode(mode, false);
Aura.Mode = mode;
@@ -127,15 +192,27 @@ namespace GHelper
}
public void SetAuraColor(Color color, bool apply = true)
public void SetAuraColor(Color? color1 = null, Color? color2 = null, bool apply = true)
{
Aura.Color1 = color;
Program.config.setConfig("aura_color", color.ToArgb());
if (color1 is not null)
{
Aura.Color1 = (Color)color1;
Program.config.setConfig("aura_color", Aura.Color1.ToArgb());
}
if (color2 is not null)
{
Aura.Color2 = (Color)color2;
Program.config.setConfig("aura_color2", Aura.Color2.ToArgb());
}
if (apply)
Aura.ApplyAura();
buttonKeyboardColor.FlatAppearance.BorderColor = color;
pictureColor.BackColor = Aura.Color1;
pictureColor2.BackColor = Aura.Color2;
}
public void SetAuraMode(int mode = 0, bool apply = true)
@@ -143,11 +220,14 @@ namespace GHelper
//Debug.WriteLine(mode);
if (mode > 3) mode = 0;
if (mode > 4) mode = 0;
pictureColor2.Visible = (mode == Aura.Breathe);
if (Aura.Mode == mode) return; // same mode
Aura.Mode = mode;
Program.config.setConfig("aura_mode", mode);
comboKeyboard.SelectedValueChanged -= ComboKeyboard_SelectedValueChanged;
@@ -181,7 +261,7 @@ namespace GHelper
CheckBox chk = (CheckBox)sender;
if (chk.Checked)
NativeMethods.SetCPUBoost(3);
NativeMethods.SetCPUBoost(2);
else
NativeMethods.SetCPUBoost(0);
}
@@ -332,35 +412,32 @@ namespace GHelper
aTimer.Enabled = false;
}
private static string FormatFan(int fan)
{
if (Program.config.getConfig("fan_rpm") == 1)
return " Fan: " + (fan * 100).ToString() + "RPM";
else
return " Fan: " + Math.Round(fan / 0.6).ToString() + "%"; // relatively to 6000 rpm
}
private static void RefreshSensors()
{
string cpuFan = " Fan: " + Math.Round(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan) / 0.6).ToString() + "%";
string gpuFan = " Fan: " + Math.Round(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan) / 0.6) + "%";
string cpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan));
string gpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan));
string cpuTemp = "";
string gpuTemp = "";
string battery = "";
try
{
Program.hwmonitor.ReadSensors();
}
catch
{
Debug.WriteLine("Failed reading sensors");
}
HardwareMonitor.ReadSensors();
if (Program.hwmonitor.cpuTemp > 0)
cpuTemp = ": " + Math.Round((decimal)Program.hwmonitor.cpuTemp).ToString() + "°C - ";
if (HardwareMonitor.cpuTemp > 0)
cpuTemp = ": " + Math.Round((decimal)HardwareMonitor.cpuTemp).ToString() + "°C - ";
if (Program.hwmonitor.gpuTemp > 0)
gpuTemp = ": " + Math.Round((decimal)Program.hwmonitor.gpuTemp).ToString() + "°C - ";
if (Program.hwmonitor.batteryDischarge > 0)
battery = "Discharging: " + Math.Round((decimal)Program.hwmonitor.batteryDischarge, 1).ToString() + "W";
if (Program.hwmonitor.batteryCharge > 0)
battery = "Charging: " + Math.Round((decimal)Program.hwmonitor.batteryCharge, 1).ToString() + "W";
if (HardwareMonitor.batteryDischarge > 0)
battery = "Discharging: " + Math.Round((decimal)HardwareMonitor.batteryDischarge, 1).ToString() + "W";
Program.settingsForm.BeginInvoke(delegate
{
@@ -373,7 +450,7 @@ namespace GHelper
private static void OnTimedEvent(Object? source, ElapsedEventArgs? e)
{
RefreshSensors();
aTimer.Interval = 2000;
aTimer.Interval = 1000;
}
private void SettingsForm_VisibleChanged(object? sender, EventArgs e)
@@ -382,18 +459,17 @@ namespace GHelper
{
InitScreen();
this.Left = Screen.FromControl(this).Bounds.Width - 10 - this.Width;
this.Left = Screen.FromControl(this).WorkingArea.Width - 10 - this.Width;
this.Top = Screen.FromControl(this).WorkingArea.Height - 10 - this.Height;
this.Activate();
aTimer.Interval = 500;
aTimer.Interval = 100;
aTimer.Enabled = true;
}
else
{
aTimer.Enabled = false;
Program.hwmonitor.StopReading();
}
}
@@ -421,19 +497,35 @@ namespace GHelper
break;
}
int oldMode = Program.config.getConfig("performance_mode");
Program.config.setConfig("performance_"+(int)SystemInformation.PowerStatus.PowerLineStatus, PerformanceMode);
Program.config.setConfig("performance_mode", PerformanceMode);
try
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, PerformanceMode);
if (Program.config.getConfig("auto_apply_" + PerformanceMode) == 1)
{
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, PerformanceMode);
}
catch
{
labelPerf.Text = "Performance Mode: not supported";
Program.wmi.SetFanCurve(0, Program.config.getFanConfig(0));
Program.wmi.SetFanCurve(1, Program.config.getFanConfig(1));
}
if (fans != null && fans.Text != "")
{
fans.LoadFans();
fans.ResetApplyLabel();
}
if (notify && (oldMode != PerformanceMode))
{
try
{
Program.toast.RunToast(perfName);
}
catch
{
Debug.WriteLine("Toast error");
}
}
}
@@ -443,12 +535,22 @@ namespace GHelper
SetPerformanceMode(Program.config.getConfig("performance_mode") + 1, true);
}
public void AutoScreen(int Plugged = 1)
public void AutoPerformance(PowerLineStatus Plugged = PowerLineStatus.Online)
{
int mode = Program.config.getConfig("performance_"+(int)Plugged);
if (mode != -1)
SetPerformanceMode(mode, true);
else
SetPerformanceMode(Program.config.getConfig("performance_mode"));
}
public void AutoScreen(PowerLineStatus Plugged = PowerLineStatus.Online)
{
int ScreenAuto = Program.config.getConfig("screen_auto");
if (ScreenAuto != 1) return;
if (Plugged == 1)
if (Plugged == PowerLineStatus.Online)
SetScreen(1000, 1);
else
SetScreen(60, 0);
@@ -457,7 +559,7 @@ namespace GHelper
}
public void AutoGPUMode(int Plugged = 1)
public void AutoGPUMode(PowerLineStatus Plugged = PowerLineStatus.Online)
{
int GpuAuto = Program.config.getConfig("gpu_auto");
@@ -471,12 +573,12 @@ namespace GHelper
return;
else
{
if (eco == 1 && Plugged == 1) // Eco going Standard on plugged
if (eco == 1 && Plugged == PowerLineStatus.Online) // Eco going Standard on plugged
{
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 0);
InitGPUMode();
}
else if (eco == 0 && Plugged == 0) // Standard going Eco on plugged
else if (eco == 0 && Plugged != PowerLineStatus.Online) // Standard going Eco on plugged
{
Program.wmi.DeviceSet(ASUSWmi.GPUEco, 1);
InitGPUMode();
@@ -580,9 +682,14 @@ namespace GHelper
checkScreen.Checked = (ScreenAuto == 1);
}
public void VisualiseGPUMode(int GPUMode)
public void VisualiseGPUMode(int GPUMode = -1)
{
if (GPUMode == -1)
{
GPUMode = Program.config.getConfig("gpu_mode");
}
buttonEco.FlatAppearance.BorderSize = buttonInactive;
buttonStandard.FlatAppearance.BorderSize = buttonInactive;
buttonUltimate.FlatAppearance.BorderSize = buttonInactive;
@@ -654,18 +761,12 @@ namespace GHelper
public void SetBatteryChargeLimit(int limit = 100)
{
if (limit < 50 || limit > 100) limit = 100;
if (limit < 40 || limit > 100) return;
labelBatteryTitle.Text = "Battery Charge Limit: " + limit.ToString() + "%";
trackBattery.Value = limit;
try
{
Program.wmi.DeviceSet(ASUSWmi.BatteryLimit, limit);
}
catch
{
Debug.WriteLine("Can't set battery charge limit");
}
Program.wmi.DeviceSet(ASUSWmi.BatteryLimit, limit);
Program.config.setConfig("charge_limit", limit);
}

View File

@@ -10,17 +10,6 @@ public class Startup
public static bool IsScheduled()
{
TaskService taskService = new TaskService();
// cleanup of OLD autorun
try
{
taskService.RootFolder.DeleteTask("GSharpHelper");
} catch
{
Debug.WriteLine("Not running as admin");
}
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
}

85
ToastForm.Designer.cs generated
View File

@@ -1,85 +0,0 @@
namespace GHelper
{
partial class ToastForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.pictureIcon = new System.Windows.Forms.PictureBox();
this.labelMode = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureIcon)).BeginInit();
this.SuspendLayout();
//
// pictureIcon
//
this.pictureIcon.BackgroundImage = global::GHelper.Properties.Resources.icons8_speed_96;
this.pictureIcon.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
this.pictureIcon.Location = new System.Drawing.Point(21, 21);
this.pictureIcon.Name = "pictureIcon";
this.pictureIcon.Size = new System.Drawing.Size(82, 80);
this.pictureIcon.TabIndex = 0;
this.pictureIcon.TabStop = false;
//
// labelMode
//
this.labelMode.AutoSize = true;
this.labelMode.Font = new System.Drawing.Font("Segoe UI", 16F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
this.labelMode.Location = new System.Drawing.Point(127, 32);
this.labelMode.Name = "labelMode";
this.labelMode.Size = new System.Drawing.Size(195, 59);
this.labelMode.TabIndex = 1;
this.labelMode.Text = "Balanced";
this.labelMode.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// ToastForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(13F, 32F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ControlLightLight;
this.ClientSize = new System.Drawing.Size(356, 122);
this.Controls.Add(this.labelMode);
this.Controls.Add(this.pictureIcon);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.MaximizeBox = false;
this.MdiChildrenMinimizedAnchorBottom = false;
this.MinimizeBox = false;
this.Name = "ToastForm";
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "ToastForm";
this.TopMost = true;
((System.ComponentModel.ISupportInitialize)(this.pictureIcon)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private PictureBox pictureIcon;
private Label labelMode;
}
}

View File

@@ -1,68 +1,94 @@
using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;
using OSD;
namespace GHelper
{
public partial class ToastForm : Form
static class Drawing
{
private System.Windows.Forms.Timer timer = default!;
private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
int hWnd, // Window handle
int hWndInsertAfter, // Placement-order handle
int X, // Horizontal position
int Y, // Vertical position
int cx, // Width
int cy, // Height
uint uFlags); // Window positioning flags
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
static void ShowInactiveTopmost(Form frm)
public static GraphicsPath RoundedRect(Rectangle bounds, int radius)
{
ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
frm.Left, frm.Top, frm.Width, frm.Height,
SWP_NOACTIVATE);
int diameter = radius * 2;
Size size = new Size(diameter, diameter);
Rectangle arc = new Rectangle(bounds.Location, size);
GraphicsPath path = new GraphicsPath();
if (radius == 0)
{
path.AddRectangle(bounds);
return path;
}
path.AddArc(arc, 180, 90);
arc.X = bounds.Right - diameter;
path.AddArc(arc, 270, 90);
arc.Y = bounds.Bottom - diameter;
path.AddArc(arc, 0, 90);
arc.X = bounds.Left;
path.AddArc(arc, 90, 90);
path.CloseFigure();
return path;
}
public ToastForm()
public static void FillRoundedRectangle(this Graphics graphics, Brush brush, Rectangle bounds, int cornerRadius)
{
InitializeComponent();
using (GraphicsPath path = RoundedRect(bounds, cornerRadius))
{
graphics.FillPath(brush, path);
}
}
}
class ToastForm : OSDNativeForm
{
protected static string toastText = "Balanced";
protected static System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
protected override void PerformPaint(PaintEventArgs e)
{
Brush brush = new SolidBrush(Color.FromArgb(150,Color.Black));
Drawing.FillRoundedRectangle(e.Graphics, brush, this.Bound, 10);
StringFormat format = new StringFormat();
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);
}
public void RunToast(string text)
{
Top = Screen.FromControl(this).WorkingArea.Height - this.Height - 100;
Left = (Screen.FromControl(this).Bounds.Width - this.Width) / 2;
toastText = text;
Screen screen1 = Screen.FromHandle(base.Handle);
ShowInactiveTopmost(this);
Width = 300;
Height = 100;
X = (screen1.Bounds.Width - this.Width)/2;
Y = screen1.Bounds.Height - 300 - this.Height;
labelMode.Text = text;
Show();
timer = new System.Windows.Forms.Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Stop();
timer.Tick -= timer_Tick;
timer.Tick += timer_Tick;
timer.Enabled = true;
timer.Interval = 1000;
timer.Interval = 2000;
timer.Start();
}
private void ToastForm_Show(object? sender, EventArgs e)
{
}
private void timer_Tick(object sender, EventArgs e)
private void timer_Tick(object? sender, EventArgs e)
{
timer.Stop();
Close();
Hide();
}
}
}

View File

@@ -16,7 +16,6 @@
Remove this element if your application requires this virtualization for backwards
compatibility.
-->
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

BIN
screenshots/screen-5w.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 KiB

15
stop-asus-sv.bat Normal file
View File

@@ -0,0 +1,15 @@
sc STOP AsusAppService
sc STOP ASUSLinkNear
sc STOP ASUSLinkRemote
sc STOP ASUSSoftwareManager
sc STOP ASUSSwitch
sc STOP ASUSSystemAnalysis
sc STOP ASUSSystemDiagnosis
sc DELETE AsusAppService
sc DELETE ASUSLinkNear
sc DELETE ASUSLinkRemote
sc DELETE ASUSSoftwareManager
sc DELETE ASUSSwitch
sc DELETE ASUSSystemAnalysis
sc DELETE ASUSSystemDiagnosis