Compare commits
239 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
602dfea1a6 | ||
|
|
c13a6e9ded | ||
|
|
e11027963f | ||
|
|
9d2b8b506e | ||
|
|
988c9e11dd | ||
|
|
2c6bb32e4a | ||
|
|
e33a0d05ed | ||
|
|
1c283766aa | ||
|
|
f2ef6d197f | ||
|
|
13ec0f8911 | ||
|
|
fcf213f1a0 | ||
|
|
c73b4fce97 | ||
|
|
aab1e08729 | ||
|
|
cf3a84aa3d | ||
|
|
8d119b386d | ||
|
|
0605e63433 | ||
|
|
4634404ed4 | ||
|
|
dcfaf665cd | ||
|
|
15e791cbfd | ||
|
|
5d86c821f6 | ||
|
|
e5de404e5c | ||
|
|
13aa98e954 | ||
|
|
75c397d7a4 | ||
|
|
0ad8efdb7d | ||
|
|
2064f29433 | ||
|
|
890c50d90e | ||
|
|
bd207113f8 | ||
|
|
650a5ff5c0 | ||
|
|
01ce91a474 | ||
|
|
253e1eb095 | ||
|
|
b95768d547 | ||
|
|
dfbfd16d23 | ||
|
|
3eeac0353a | ||
|
|
5e7c9a4191 | ||
|
|
ee84ba6304 | ||
|
|
d15c6cb073 | ||
|
|
1e683a0884 | ||
|
|
1ad48bf763 | ||
|
|
dcc052a574 | ||
|
|
38fca560df | ||
|
|
7e0459bd44 | ||
|
|
228ad70b8d | ||
|
|
b42e565cd6 | ||
|
|
e021d59737 | ||
|
|
dba7967ad5 | ||
|
|
a7a7170676 | ||
|
|
1d43ca3ce4 | ||
|
|
ff7618f16f | ||
|
|
bb947bf8bf | ||
|
|
63092d8415 | ||
|
|
6fbce2f495 | ||
|
|
8d89a04608 | ||
|
|
0cbc48d526 | ||
|
|
81013ca0be | ||
|
|
af2509fc17 | ||
|
|
136b5b4f55 | ||
|
|
4e2abff942 | ||
|
|
2c8a11fc24 | ||
|
|
8af8823ee4 | ||
|
|
ec0a1b710e | ||
|
|
2ac2e84161 | ||
|
|
14dc1741f7 | ||
|
|
fbed195194 | ||
|
|
0d002edf65 | ||
|
|
28a17562a8 | ||
|
|
583cb677d0 | ||
|
|
1888fe7bd9 | ||
|
|
089b339e61 | ||
|
|
cab4a04339 | ||
|
|
7ab3b450cd | ||
|
|
ea2dc7b75d | ||
|
|
ccd69a8628 | ||
|
|
c1d23159a0 | ||
|
|
1c865624e6 | ||
|
|
4853c09c2c | ||
|
|
08704d6826 | ||
|
|
6edbcf5ecd | ||
|
|
7702dc8e38 | ||
|
|
94391358ef | ||
|
|
feecd193ac | ||
|
|
444f7c76f0 | ||
|
|
701423fa0e | ||
|
|
7b3a6d319b | ||
|
|
8bc9325b3f | ||
|
|
64195c5082 | ||
|
|
2297532323 | ||
|
|
daac8b0a45 | ||
|
|
f061e3f43a | ||
|
|
85e02549f1 | ||
|
|
9053764930 | ||
|
|
64871e5554 | ||
|
|
b1c778b30d | ||
|
|
6932bb1889 | ||
|
|
c90a342ce8 | ||
|
|
f223ca4a33 | ||
|
|
023607da4b | ||
|
|
264631ab77 | ||
|
|
1bd5d79983 | ||
|
|
83b184a061 | ||
|
|
9ff572b8f6 | ||
|
|
cdb633be04 | ||
|
|
7cb9b1f64f | ||
|
|
06be8c726e | ||
|
|
265c6ce417 | ||
|
|
add852ce5d | ||
|
|
d4a5164b16 | ||
|
|
14618ee19e | ||
|
|
0b3a75e373 | ||
|
|
64e390a61f | ||
|
|
1cd808de07 | ||
|
|
d82f1c8d70 | ||
|
|
9189cf0a46 | ||
|
|
3a7c4278a0 | ||
|
|
7065ba8661 | ||
|
|
1bce4a4b51 | ||
|
|
468f9c4034 | ||
|
|
4d347df45c | ||
|
|
d7f1d1d5fd | ||
|
|
6800ae38dd | ||
|
|
9b2b96fbf0 | ||
|
|
04b3a15d8f | ||
|
|
aae0570340 | ||
|
|
b142d566da | ||
|
|
a9115d0dff | ||
|
|
e3a3e81245 | ||
|
|
c50c1807ca | ||
|
|
5767320437 | ||
|
|
74846097db | ||
|
|
5b89556ed3 | ||
|
|
845b182b55 | ||
|
|
b7cfd04560 | ||
|
|
6ffd464ec4 | ||
|
|
e7dd3ce203 | ||
|
|
d06dae9015 | ||
|
|
1b208e1a74 | ||
|
|
6befab190b | ||
|
|
5d3eaa0055 | ||
|
|
667f1a997c | ||
|
|
4542221a58 | ||
|
|
5fd7b74519 | ||
|
|
014ee635d6 | ||
|
|
1dff60d574 | ||
|
|
7395f0be69 | ||
|
|
e3019a313a | ||
|
|
9653b81cd3 | ||
|
|
9713cb6fa4 | ||
|
|
10053eda10 | ||
|
|
ef1bbc1fce | ||
|
|
3fde8c1fa9 | ||
|
|
efd6707e61 | ||
|
|
8032ea3fc7 | ||
|
|
d0a232d888 | ||
|
|
a6bd18f019 | ||
|
|
a09c252c2e | ||
|
|
99d3c61897 | ||
|
|
4a6decb0be | ||
|
|
80b9fdb8ac | ||
|
|
e3c293942c | ||
|
|
42e910e635 | ||
|
|
18b6ae07b2 | ||
|
|
fa2875fbee | ||
|
|
f2bfb24fb4 | ||
|
|
adc81721ac | ||
|
|
9da061d621 | ||
|
|
274c04bf61 | ||
|
|
2d286ca04f | ||
|
|
2c1fa01863 | ||
|
|
0370ef7bc0 | ||
|
|
2f2ef23ee4 | ||
|
|
756ed44741 | ||
|
|
efb6a087b4 | ||
|
|
4e6f55c24d | ||
|
|
c029df357a | ||
|
|
8d19b5f89c | ||
|
|
7683e68df3 | ||
|
|
e45bcdf8a5 | ||
|
|
ab8d42c216 | ||
|
|
d248fcf384 | ||
|
|
9bb5e41a5d | ||
|
|
bc965c003d | ||
|
|
a6cfc91de2 | ||
|
|
9ca6ec657f | ||
|
|
89d7930323 | ||
|
|
e26d26b498 | ||
|
|
a6d0dde4b0 | ||
|
|
f68d53aaf4 | ||
|
|
a2ea3d18fd | ||
|
|
f77fcc940f | ||
|
|
dd4d85f254 | ||
|
|
2afbde814f | ||
|
|
b6b06a3802 | ||
|
|
4d58945688 | ||
|
|
9aaf0159e5 | ||
|
|
3cbaf1eb52 | ||
|
|
c76fbeab37 | ||
|
|
15d580bbe3 | ||
|
|
2ec64bf8b5 | ||
|
|
254be71e88 | ||
|
|
e9ec8f0e8f | ||
|
|
0ef44a0495 | ||
|
|
e725760b24 | ||
|
|
a83ab4884e | ||
|
|
7bfd10c65d | ||
|
|
67b541b145 | ||
|
|
f1ae14652f | ||
|
|
223ead2f4e | ||
|
|
a211dd412f | ||
|
|
550e9fc036 | ||
|
|
8fe01e8790 | ||
|
|
f0abe22b5d | ||
|
|
ef0993e442 | ||
|
|
62ac478761 | ||
|
|
a7e8ba3241 | ||
|
|
b46f0fb887 | ||
|
|
a39c084bdf | ||
|
|
f0c291bea4 | ||
|
|
d04a20367b | ||
|
|
888e49fe40 | ||
|
|
4875a22f38 | ||
|
|
ea2e8a7c24 | ||
|
|
6ec94e4ac3 | ||
|
|
5334d1e4ed | ||
|
|
9f339806d4 | ||
|
|
54a4668e2a | ||
|
|
71d2a6ce05 | ||
|
|
92d1b97b95 | ||
|
|
4b9a53cef8 | ||
|
|
068694d7d1 | ||
|
|
43c6def162 | ||
|
|
306697f026 | ||
|
|
c5a32cc9d5 | ||
|
|
51acd9a612 | ||
|
|
457a37049c | ||
|
|
6d2cece4f2 | ||
|
|
265611009c | ||
|
|
2714b6dca7 | ||
|
|
f6de5eba64 | ||
|
|
13f7c81689 | ||
|
|
8c0d84b65b |
128
.github/CODE_OF_CONDUCT.md
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, religion, or sexual identity
|
||||
and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the
|
||||
overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or
|
||||
advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email
|
||||
address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or
|
||||
permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within
|
||||
the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.0, available at
|
||||
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
https://www.contributor-covenant.org/faq. Translations are available at
|
||||
https://www.contributor-covenant.org/translations.
|
||||
1
.github/CONTRIBUTING.md
vendored
Normal file
@@ -0,0 +1 @@
|
||||
Please, feel free to contribute. Especially if you own model differnt from G14 2022 and can offer extra features or support.
|
||||
40
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**Clear scenario to Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. Explanation of an error or a bug
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**App Logs**
|
||||
Please include and attach log.txt from ``%AppData%\GHelper``
|
||||
|
||||
**Screenshots or screencasts**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. Windows 11]
|
||||
- Laptop model
|
||||
|
||||
**Asus software**
|
||||
- Armoury crate (or it's services installed)
|
||||
- MyASUS installed
|
||||
- Other Asus services running in background
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
||||
## NOTE
|
||||
Bug reports without clear information or scenario to reproduce will be closed without answer.
|
||||
Please respect time of the developer. Thanks.
|
||||
10
.github/ISSUE_TEMPLATE/custom.md
vendored
Normal file
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: Custom issue template
|
||||
about: Describe this issue template's purpose here.
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
||||
16
.github/SECURITY.md
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 0.25+ | :white_check_mark: |
|
||||
| < 0.24 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Use this section to tell people how to report a vulnerability.
|
||||
|
||||
Tell them where to go, how often they can expect to get an update on a
|
||||
reported vulnerability, what to expect if the vulnerability is accepted or
|
||||
declined, etc.
|
||||
@@ -1,292 +0,0 @@
|
||||
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
|
||||
|
||||
using Starlight.Communication;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
|
||||
namespace Starlight.AnimeMatrix
|
||||
{
|
||||
public class BuiltInAnimation
|
||||
{
|
||||
public enum Startup
|
||||
{
|
||||
GlitchConstruction,
|
||||
StaticEmergence
|
||||
}
|
||||
|
||||
public enum Shutdown
|
||||
{
|
||||
GlitchOut,
|
||||
SeeYa
|
||||
}
|
||||
|
||||
public enum Sleeping
|
||||
{
|
||||
BannerSwipe,
|
||||
Starfield
|
||||
}
|
||||
|
||||
public enum Running
|
||||
{
|
||||
BinaryBannerScroll,
|
||||
RogLogoGlitch
|
||||
}
|
||||
|
||||
public byte AsByte { get; }
|
||||
|
||||
public BuiltInAnimation(
|
||||
Running running,
|
||||
Sleeping sleeping,
|
||||
Shutdown shutdown,
|
||||
Startup startup
|
||||
)
|
||||
{
|
||||
AsByte |= (byte)(((int)running & 0x01) << 0);
|
||||
AsByte |= (byte)(((int)sleeping & 0x01) << 1);
|
||||
AsByte |= (byte)(((int)shutdown & 0x01) << 2);
|
||||
AsByte |= (byte)(((int)startup & 0x01) << 3);
|
||||
}
|
||||
}
|
||||
|
||||
internal class AnimeMatrixPacket : Packet
|
||||
{
|
||||
public AnimeMatrixPacket(byte[] command)
|
||||
: base(0x5E, 640, command)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public enum BrightnessMode : byte
|
||||
{
|
||||
Off = 0,
|
||||
Dim = 1,
|
||||
Medium = 2,
|
||||
Full = 3
|
||||
}
|
||||
|
||||
|
||||
public class AnimeMatrixDevice : Device
|
||||
{
|
||||
private const int UpdatePageLength = 0x0278;
|
||||
|
||||
public int LedCount => 1450;
|
||||
public int Rows => 61;
|
||||
|
||||
private byte[] _displayBuffer = new byte[UpdatePageLength * 3];
|
||||
private List<byte[]> frames = new List<byte[]>();
|
||||
|
||||
private int frameIndex = 0;
|
||||
|
||||
public AnimeMatrixDevice()
|
||||
: base(0x0B05, 0x193B, 640)
|
||||
{
|
||||
}
|
||||
|
||||
public byte[] GetBuffer()
|
||||
{
|
||||
return _displayBuffer;
|
||||
}
|
||||
|
||||
public void PresentNextFrame()
|
||||
{
|
||||
//Debug.WriteLine(frameIndex);
|
||||
if (frameIndex >= frames.Count) frameIndex = 0;
|
||||
_displayBuffer = frames[frameIndex];
|
||||
Present();
|
||||
frameIndex++;
|
||||
}
|
||||
|
||||
public void ClearFrames()
|
||||
{
|
||||
frames.Clear();
|
||||
frameIndex = 0;
|
||||
}
|
||||
|
||||
public void AddFrame()
|
||||
{
|
||||
frames.Add(_displayBuffer.ToArray());
|
||||
}
|
||||
|
||||
public void SendRaw(params byte[] data)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(data));
|
||||
}
|
||||
|
||||
|
||||
public int EmptyColumns(int row)
|
||||
{
|
||||
return (int)Math.Ceiling(Math.Max(0, row - 11) / 2.0);
|
||||
}
|
||||
public int Columns(int row)
|
||||
{
|
||||
EnsureRowInRange(row);
|
||||
return 34 - EmptyColumns(row);
|
||||
}
|
||||
|
||||
public int RowToLinearAddress(int row)
|
||||
{
|
||||
EnsureRowInRange(row);
|
||||
|
||||
var ret = 0;
|
||||
|
||||
if (row > 0)
|
||||
{
|
||||
for (var i = 0; i < row; i++)
|
||||
ret += Columns(i);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void WakeUp()
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
|
||||
}
|
||||
|
||||
public void SetLedLinear(int address, byte value)
|
||||
{
|
||||
EnsureAddressableLed(address);
|
||||
_displayBuffer[address] = value;
|
||||
}
|
||||
|
||||
public void SetLedLinearImmediate(int address, byte value)
|
||||
{
|
||||
EnsureAddressableLed(address);
|
||||
_displayBuffer[address] = value;
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(address + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)0x0001))
|
||||
.AppendData(value)
|
||||
);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
|
||||
}
|
||||
|
||||
public void SetLedPlanar(int x, int y, byte value)
|
||||
{
|
||||
EnsureRowInRange(y);
|
||||
var start = RowToLinearAddress(y) - EmptyColumns(y);
|
||||
|
||||
if (x > EmptyColumns(y))
|
||||
SetLedLinear(start + x, value);
|
||||
}
|
||||
|
||||
public void Clear(bool present = false)
|
||||
{
|
||||
for (var i = 0; i < _displayBuffer.Length; i++)
|
||||
_displayBuffer[i] = 0;
|
||||
|
||||
if (present)
|
||||
Present();
|
||||
}
|
||||
|
||||
public void Present()
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 0 + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)UpdatePageLength))
|
||||
.AppendData(_displayBuffer[(UpdatePageLength * 0)..(UpdatePageLength * 1)])
|
||||
);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 1 + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)UpdatePageLength))
|
||||
.AppendData(_displayBuffer[(UpdatePageLength * 1)..(UpdatePageLength * 2)])
|
||||
);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(UpdatePageLength * 2 + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)(LedCount - UpdatePageLength * 2)))
|
||||
.AppendData(
|
||||
_displayBuffer[(UpdatePageLength * 2)..(UpdatePageLength * 2 + (LedCount - UpdatePageLength * 2))])
|
||||
);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
|
||||
}
|
||||
|
||||
public void SetDisplayState(bool enable)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
|
||||
.AppendData(0x00));
|
||||
}
|
||||
else
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
|
||||
.AppendData(0x80));
|
||||
}
|
||||
}
|
||||
|
||||
public void SetBrightness(BrightnessMode mode)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x04)
|
||||
.AppendData((byte)mode)
|
||||
);
|
||||
}
|
||||
|
||||
public void SetBuiltInAnimation(bool enable)
|
||||
{
|
||||
var enabled = enable ? (byte)0x00 : (byte)0x80;
|
||||
Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enabled));
|
||||
}
|
||||
|
||||
public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
|
||||
{
|
||||
SetBuiltInAnimation(enable);
|
||||
Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));
|
||||
}
|
||||
|
||||
public void GenerateFrame(Image image)
|
||||
{
|
||||
|
||||
int width = 34 * 3;
|
||||
int height = 61;
|
||||
float scale;
|
||||
|
||||
Bitmap canvas = new Bitmap(width, height);
|
||||
|
||||
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);
|
||||
|
||||
var graph = Graphics.FromImage(canvas);
|
||||
var scaleWidth = (int)(image.Width * scale);
|
||||
var scaleHeight = (int)(image.Height * scale);
|
||||
|
||||
graph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
|
||||
graph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
|
||||
graph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
||||
|
||||
graph.DrawImage(image, ((int)width - scaleWidth), ((int)height - scaleHeight) / 2, scaleWidth, scaleHeight);
|
||||
|
||||
Bitmap bmp = new Bitmap(canvas, 34, 61);
|
||||
|
||||
for (int y = 0; y < bmp.Height; y++)
|
||||
{
|
||||
for (int x = 0; x < bmp.Width; x++)
|
||||
{
|
||||
var pixel = bmp.GetPixel(x, y);
|
||||
byte color = (byte)(Math.Max((pixel.R + pixel.G + pixel.B) / 3 - 10, 0));
|
||||
SetLedPlanar(x, y, color);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void EnsureRowInRange(int row)
|
||||
{
|
||||
if (row < 0 || row >= Rows)
|
||||
{
|
||||
throw new IndexOutOfRangeException($"Y-coordinate should fall in range of [0, {Rows - 1}].");
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureAddressableLed(int address)
|
||||
{
|
||||
if (address < 0 || address >= LedCount)
|
||||
{
|
||||
throw new IndexOutOfRangeException($"Linear LED address must be in range of [0, {LedCount - 1}].");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
82
Aura.cs
@@ -1,82 +0,0 @@
|
||||
using HidLibrary;
|
||||
|
||||
public class Aura
|
||||
{
|
||||
|
||||
static byte[] MESSAGE_SET = { 0x5d, 0xb5, 0,0,0 };
|
||||
static byte[] MESSAGE_APPLY = { 0x5d, 0xb4};
|
||||
|
||||
public const int Static = 0;
|
||||
public const int Breathe = 1;
|
||||
public const int Strobe = 2;
|
||||
public const int Rainbow = 3;
|
||||
public const int Dingding = 4;
|
||||
|
||||
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;
|
||||
public static Color Color2 = Color.Black;
|
||||
public static int Speed = SpeedSlow;
|
||||
|
||||
public static byte[] AuraMessage(int mode, Color color, Color color2, int speed)
|
||||
{
|
||||
byte[] msg = new byte[17];
|
||||
msg[0] = 0x5d;
|
||||
msg[1] = 0xb3;
|
||||
msg[2] = 0x00; // Zone
|
||||
msg[3] = (byte)mode; // Aura Mode
|
||||
msg[4] = (byte)(color.R); // R
|
||||
msg[5] = (byte)(color.G); // G
|
||||
msg[6] = (byte)(color.B); // B
|
||||
msg[7] = (byte)speed; // aura.speed as u8;
|
||||
msg[8] = 0; // aura.direction as u8;
|
||||
msg[10] = (byte)(color2.R); // R
|
||||
msg[11] = (byte)(color2.G); // G
|
||||
msg[12] = (byte)(color2.B); // B
|
||||
return msg;
|
||||
}
|
||||
|
||||
public static void ApplyAura()
|
||||
{
|
||||
|
||||
HidDevice[] HidDeviceList;
|
||||
int[] deviceIds = { 0x1854, 0x1869, 0x1866, 0x19b6 };
|
||||
|
||||
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)
|
||||
{
|
||||
if (device.Description.IndexOf("HID") >= 0)
|
||||
{
|
||||
device.OpenDevice();
|
||||
byte[] msg = AuraMessage(Mode, Color1, Color2, Speed);
|
||||
device.Write(msg);
|
||||
device.Write(MESSAGE_SET);
|
||||
device.Write(MESSAGE_APPLY);
|
||||
device.CloseDevice();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
373
Fans.Designer.cs
generated
@@ -1,373 +0,0 @@
|
||||
namespace GHelper
|
||||
{
|
||||
partial class Fans
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea5 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
|
||||
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea6 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
|
||||
panelFans = new Panel();
|
||||
checkAuto = new CheckBox();
|
||||
chartGPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
|
||||
buttonReset = new Button();
|
||||
buttonApply = new Button();
|
||||
chartCPU = new System.Windows.Forms.DataVisualization.Charting.Chart();
|
||||
panelPower = new Panel();
|
||||
labelPowerLimits = new Label();
|
||||
checkApplyPower = new CheckBox();
|
||||
buttonApplyPower = new Button();
|
||||
panelCPU = new Panel();
|
||||
labelCPU = new Label();
|
||||
label2 = new Label();
|
||||
trackCPU = new TrackBar();
|
||||
panelTotal = new Panel();
|
||||
labelTotal = new Label();
|
||||
label1 = new Label();
|
||||
trackTotal = new TrackBar();
|
||||
labelApplied = new Label();
|
||||
pictureFine = new PictureBox();
|
||||
labelInfo = new Label();
|
||||
panelFans.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
|
||||
panelPower.SuspendLayout();
|
||||
panelCPU.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();
|
||||
panelTotal.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pictureFine).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// panelFans
|
||||
//
|
||||
panelFans.Controls.Add(checkAuto);
|
||||
panelFans.Controls.Add(chartGPU);
|
||||
panelFans.Controls.Add(buttonReset);
|
||||
panelFans.Controls.Add(buttonApply);
|
||||
panelFans.Controls.Add(chartCPU);
|
||||
panelFans.Dock = DockStyle.Left;
|
||||
panelFans.Location = new Point(363, 0);
|
||||
panelFans.Margin = new Padding(10);
|
||||
panelFans.MinimumSize = new Size(868, 1089);
|
||||
panelFans.Name = "panelFans";
|
||||
panelFans.Padding = new Padding(10);
|
||||
panelFans.Size = new Size(872, 1089);
|
||||
panelFans.TabIndex = 12;
|
||||
//
|
||||
// checkAuto
|
||||
//
|
||||
checkAuto.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
checkAuto.AutoSize = true;
|
||||
checkAuto.Location = new Point(584, 981);
|
||||
checkAuto.Margin = new Padding(4, 2, 4, 2);
|
||||
checkAuto.Name = "checkAuto";
|
||||
checkAuto.Size = new Size(165, 36);
|
||||
checkAuto.TabIndex = 17;
|
||||
checkAuto.Text = "Auto Apply";
|
||||
checkAuto.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chartGPU
|
||||
//
|
||||
chartGPU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
chartArea5.Name = "ChartArea1";
|
||||
chartGPU.ChartAreas.Add(chartArea5);
|
||||
chartGPU.Location = new Point(22, 502);
|
||||
chartGPU.Margin = new Padding(4, 2, 4, 2);
|
||||
chartGPU.Name = "chartGPU";
|
||||
chartGPU.Size = new Size(810, 460);
|
||||
chartGPU.TabIndex = 16;
|
||||
chartGPU.Text = "chart1";
|
||||
//
|
||||
// buttonReset
|
||||
//
|
||||
buttonReset.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
|
||||
buttonReset.Location = new Point(22, 1025);
|
||||
buttonReset.Margin = new Padding(4, 2, 4, 2);
|
||||
buttonReset.Name = "buttonReset";
|
||||
buttonReset.Size = new Size(231, 44);
|
||||
buttonReset.TabIndex = 15;
|
||||
buttonReset.Text = "Factory Defaults";
|
||||
buttonReset.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonApply
|
||||
//
|
||||
buttonApply.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
buttonApply.Location = new Point(584, 1025);
|
||||
buttonApply.Margin = new Padding(4, 2, 4, 2);
|
||||
buttonApply.Name = "buttonApply";
|
||||
buttonApply.Size = new Size(248, 44);
|
||||
buttonApply.TabIndex = 14;
|
||||
buttonApply.Text = "Apply Fan Curve";
|
||||
buttonApply.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// chartCPU
|
||||
//
|
||||
chartCPU.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
chartArea6.Name = "ChartArea1";
|
||||
chartCPU.ChartAreas.Add(chartArea6);
|
||||
chartCPU.Location = new Point(22, 21);
|
||||
chartCPU.Margin = new Padding(10);
|
||||
chartCPU.Name = "chartCPU";
|
||||
chartCPU.Size = new Size(810, 460);
|
||||
chartCPU.TabIndex = 13;
|
||||
chartCPU.Text = "chartCPU";
|
||||
//
|
||||
// panelPower
|
||||
//
|
||||
panelPower.Controls.Add(labelPowerLimits);
|
||||
panelPower.Controls.Add(checkApplyPower);
|
||||
panelPower.Controls.Add(buttonApplyPower);
|
||||
panelPower.Controls.Add(panelCPU);
|
||||
panelPower.Controls.Add(panelTotal);
|
||||
panelPower.Controls.Add(labelApplied);
|
||||
panelPower.Controls.Add(pictureFine);
|
||||
panelPower.Controls.Add(labelInfo);
|
||||
panelPower.Dock = DockStyle.Left;
|
||||
panelPower.Location = new Point(0, 0);
|
||||
panelPower.Name = "panelPower";
|
||||
panelPower.Size = new Size(363, 1089);
|
||||
panelPower.TabIndex = 13;
|
||||
//
|
||||
// labelPowerLimits
|
||||
//
|
||||
labelPowerLimits.AutoSize = true;
|
||||
labelPowerLimits.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelPowerLimits.Location = new Point(23, 15);
|
||||
labelPowerLimits.Name = "labelPowerLimits";
|
||||
labelPowerLimits.Size = new Size(229, 32);
|
||||
labelPowerLimits.TabIndex = 26;
|
||||
labelPowerLimits.Text = "Power Limits (PPT)";
|
||||
//
|
||||
// checkApplyPower
|
||||
//
|
||||
checkApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
checkApplyPower.AutoSize = true;
|
||||
checkApplyPower.Location = new Point(17, 981);
|
||||
checkApplyPower.Margin = new Padding(4, 2, 4, 2);
|
||||
checkApplyPower.Name = "checkApplyPower";
|
||||
checkApplyPower.Size = new Size(165, 36);
|
||||
checkApplyPower.TabIndex = 25;
|
||||
checkApplyPower.Text = "Auto Apply";
|
||||
checkApplyPower.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// buttonApplyPower
|
||||
//
|
||||
buttonApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
buttonApplyPower.Location = new Point(17, 1025);
|
||||
buttonApplyPower.Margin = new Padding(4, 2, 4, 2);
|
||||
buttonApplyPower.Name = "buttonApplyPower";
|
||||
buttonApplyPower.Size = new Size(321, 44);
|
||||
buttonApplyPower.TabIndex = 24;
|
||||
buttonApplyPower.Text = "Apply Power Limits";
|
||||
buttonApplyPower.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// panelCPU
|
||||
//
|
||||
panelCPU.Controls.Add(labelCPU);
|
||||
panelCPU.Controls.Add(label2);
|
||||
panelCPU.Controls.Add(trackCPU);
|
||||
panelCPU.Location = new Point(184, 89);
|
||||
panelCPU.Name = "panelCPU";
|
||||
panelCPU.Size = new Size(160, 510);
|
||||
panelCPU.TabIndex = 23;
|
||||
//
|
||||
// labelCPU
|
||||
//
|
||||
labelCPU.AutoSize = true;
|
||||
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelCPU.Location = new Point(43, 41);
|
||||
labelCPU.Margin = new Padding(4, 0, 4, 0);
|
||||
labelCPU.Name = "labelCPU";
|
||||
labelCPU.Size = new Size(61, 32);
|
||||
labelCPU.TabIndex = 13;
|
||||
labelCPU.Text = "CPU";
|
||||
labelCPU.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
label2.AutoSize = true;
|
||||
label2.Location = new Point(45, 7);
|
||||
label2.Margin = new Padding(4, 0, 4, 0);
|
||||
label2.Name = "label2";
|
||||
label2.Size = new Size(58, 32);
|
||||
label2.TabIndex = 12;
|
||||
label2.Text = "CPU";
|
||||
label2.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// trackCPU
|
||||
//
|
||||
trackCPU.Location = new Point(47, 89);
|
||||
trackCPU.Margin = new Padding(4, 2, 4, 2);
|
||||
trackCPU.Maximum = 85;
|
||||
trackCPU.Minimum = 15;
|
||||
trackCPU.Name = "trackCPU";
|
||||
trackCPU.Orientation = Orientation.Vertical;
|
||||
trackCPU.Size = new Size(90, 416);
|
||||
trackCPU.TabIndex = 11;
|
||||
trackCPU.TickFrequency = 5;
|
||||
trackCPU.Value = 80;
|
||||
//
|
||||
// panelTotal
|
||||
//
|
||||
panelTotal.Controls.Add(labelTotal);
|
||||
panelTotal.Controls.Add(label1);
|
||||
panelTotal.Controls.Add(trackTotal);
|
||||
panelTotal.Location = new Point(17, 89);
|
||||
panelTotal.Name = "panelTotal";
|
||||
panelTotal.Size = new Size(160, 511);
|
||||
panelTotal.TabIndex = 22;
|
||||
//
|
||||
// labelTotal
|
||||
//
|
||||
labelTotal.AutoSize = true;
|
||||
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelTotal.Location = new Point(46, 41);
|
||||
labelTotal.Margin = new Padding(4, 0, 4, 0);
|
||||
labelTotal.Name = "labelTotal";
|
||||
labelTotal.Size = new Size(70, 32);
|
||||
labelTotal.TabIndex = 12;
|
||||
labelTotal.Text = "Total";
|
||||
labelTotal.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Location = new Point(48, 7);
|
||||
label1.Margin = new Padding(4, 0, 4, 0);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(65, 32);
|
||||
label1.TabIndex = 11;
|
||||
label1.Text = "Total";
|
||||
label1.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// trackTotal
|
||||
//
|
||||
trackTotal.Location = new Point(44, 89);
|
||||
trackTotal.Margin = new Padding(4, 2, 4, 2);
|
||||
trackTotal.Maximum = 150;
|
||||
trackTotal.Minimum = 15;
|
||||
trackTotal.Name = "trackTotal";
|
||||
trackTotal.Orientation = Orientation.Vertical;
|
||||
trackTotal.Size = new Size(90, 416);
|
||||
trackTotal.TabIndex = 10;
|
||||
trackTotal.TickFrequency = 5;
|
||||
trackTotal.TickStyle = TickStyle.TopLeft;
|
||||
trackTotal.Value = 125;
|
||||
//
|
||||
// labelApplied
|
||||
//
|
||||
labelApplied.AutoSize = true;
|
||||
labelApplied.ForeColor = Color.Tomato;
|
||||
labelApplied.Location = new Point(23, 51);
|
||||
labelApplied.Margin = new Padding(4, 0, 4, 0);
|
||||
labelApplied.Name = "labelApplied";
|
||||
labelApplied.Size = new Size(143, 32);
|
||||
labelApplied.TabIndex = 21;
|
||||
labelApplied.Text = "Not Applied";
|
||||
//
|
||||
// pictureFine
|
||||
//
|
||||
pictureFine.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
pictureFine.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureFine.Image = Properties.Resources.everything_is_fine_itsfine;
|
||||
pictureFine.Location = new Point(17, 694);
|
||||
pictureFine.Margin = new Padding(4, 2, 4, 2);
|
||||
pictureFine.Name = "pictureFine";
|
||||
pictureFine.Size = new Size(327, 254);
|
||||
pictureFine.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pictureFine.TabIndex = 20;
|
||||
pictureFine.TabStop = false;
|
||||
pictureFine.Visible = false;
|
||||
//
|
||||
// labelInfo
|
||||
//
|
||||
labelInfo.Location = new Point(17, 603);
|
||||
labelInfo.Margin = new Padding(4, 0, 4, 0);
|
||||
labelInfo.Name = "labelInfo";
|
||||
labelInfo.Size = new Size(327, 371);
|
||||
labelInfo.TabIndex = 19;
|
||||
labelInfo.Text = "label";
|
||||
//
|
||||
// Fans
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(192F, 192F);
|
||||
AutoScaleMode = AutoScaleMode.Dpi;
|
||||
AutoSize = true;
|
||||
AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
ClientSize = new Size(1220, 1089);
|
||||
Controls.Add(panelFans);
|
||||
Controls.Add(panelPower);
|
||||
Margin = new Padding(4, 2, 4, 2);
|
||||
MaximizeBox = false;
|
||||
MdiChildrenMinimizedAnchorBottom = false;
|
||||
MinimizeBox = false;
|
||||
MinimumSize = new Size(0, 1160);
|
||||
Name = "Fans";
|
||||
ShowIcon = false;
|
||||
ShowInTaskbar = false;
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "Fans and Power";
|
||||
panelFans.ResumeLayout(false);
|
||||
panelFans.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();
|
||||
panelPower.ResumeLayout(false);
|
||||
panelPower.PerformLayout();
|
||||
panelCPU.ResumeLayout(false);
|
||||
panelCPU.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();
|
||||
panelTotal.ResumeLayout(false);
|
||||
panelTotal.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pictureFine).EndInit();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
private Panel panelFans;
|
||||
private CheckBox checkAuto;
|
||||
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
|
||||
private Button buttonReset;
|
||||
private Button buttonApply;
|
||||
private System.Windows.Forms.DataVisualization.Charting.Chart chartCPU;
|
||||
private Panel panelPower;
|
||||
private CheckBox checkApplyPower;
|
||||
private Button buttonApplyPower;
|
||||
private Panel panelCPU;
|
||||
private Label labelCPU;
|
||||
private Label label2;
|
||||
private TrackBar trackCPU;
|
||||
private Panel panelTotal;
|
||||
private Label labelTotal;
|
||||
private Label label1;
|
||||
private TrackBar trackTotal;
|
||||
private Label labelApplied;
|
||||
private PictureBox pictureFine;
|
||||
private Label labelInfo;
|
||||
private Label labelPowerLimits;
|
||||
}
|
||||
}
|
||||
173
Keyboard.Designer.cs
generated
@@ -1,173 +0,0 @@
|
||||
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();
|
||||
textFNF4 = new TextBox();
|
||||
comboFNF4 = new ComboBox();
|
||||
labelFNF4 = new Label();
|
||||
groupBox1.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
groupBox1.Controls.Add(textFNF4);
|
||||
groupBox1.Controls.Add(comboFNF4);
|
||||
groupBox1.Controls.Add(labelFNF4);
|
||||
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, 242);
|
||||
groupBox1.TabIndex = 0;
|
||||
groupBox1.TabStop = false;
|
||||
groupBox1.Text = "Key Bindings";
|
||||
//
|
||||
// textM4
|
||||
//
|
||||
textM4.Location = new Point(411, 113);
|
||||
textM4.Name = "textM4";
|
||||
textM4.PlaceholderText = "action";
|
||||
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[] { "Default", "Volume Mute", "Play / Pause", "PrintScreen", "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:";
|
||||
//
|
||||
// textFNF4
|
||||
//
|
||||
textFNF4.Location = new Point(411, 176);
|
||||
textFNF4.Name = "textFNF4";
|
||||
textFNF4.PlaceholderText = "action";
|
||||
textFNF4.Size = new Size(320, 39);
|
||||
textFNF4.TabIndex = 8;
|
||||
//
|
||||
// comboFNF4
|
||||
//
|
||||
comboFNF4.FormattingEnabled = true;
|
||||
comboFNF4.Location = new Point(93, 175);
|
||||
comboFNF4.Name = "comboFNF4";
|
||||
comboFNF4.Size = new Size(312, 40);
|
||||
comboFNF4.TabIndex = 7;
|
||||
//
|
||||
// labelFNF4
|
||||
//
|
||||
labelFNF4.AutoSize = true;
|
||||
labelFNF4.Location = new Point(2, 178);
|
||||
labelFNF4.Name = "labelFNF4";
|
||||
labelFNF4.Size = new Size(90, 32);
|
||||
labelFNF4.TabIndex = 6;
|
||||
labelFNF4.Text = "FN+F4:";
|
||||
//
|
||||
// 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;
|
||||
private TextBox textFNF4;
|
||||
private ComboBox comboFNF4;
|
||||
private Label labelFNF4;
|
||||
}
|
||||
}
|
||||
69
Keyboard.cs
@@ -1,69 +0,0 @@
|
||||
namespace GHelper
|
||||
{
|
||||
public partial class Keyboard : Form
|
||||
{
|
||||
|
||||
Dictionary<string, string> customActions = new Dictionary<string, string>
|
||||
{
|
||||
{"","--------------" },
|
||||
{"mute", "Volume Mute"},
|
||||
{"screenshot", "Screenshot"},
|
||||
{"play", "Play/Pause"},
|
||||
{"aura", "Aura"},
|
||||
{"ghelper", "Open GHelper"},
|
||||
{"custom", "Custom"}
|
||||
};
|
||||
|
||||
private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)
|
||||
{
|
||||
if (name == "m4")
|
||||
customActions[""] = "Performance";
|
||||
|
||||
if (name == "fnf4")
|
||||
{
|
||||
customActions[""] = "Aura";
|
||||
customActions.Remove("aura");
|
||||
}
|
||||
|
||||
combo.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
combo.DataSource = new BindingSource(customActions, null);
|
||||
combo.DisplayMember = "Value";
|
||||
combo.ValueMember = "Key";
|
||||
|
||||
string action = Program.config.getConfigString(name);
|
||||
|
||||
combo.SelectedValue = (action is not null) ? action : "";
|
||||
if (combo.SelectedValue is null) combo.SelectedValue = "";
|
||||
|
||||
combo.SelectedValueChanged += delegate
|
||||
{
|
||||
if (combo.SelectedValue is not null)
|
||||
Program.config.setConfig(name, combo.SelectedValue.ToString());
|
||||
};
|
||||
|
||||
txbox.Text = Program.config.getConfigString(name + "_custom");
|
||||
txbox.TextChanged += delegate
|
||||
{
|
||||
Program.config.setConfig(name + "_custom", txbox.Text);
|
||||
};
|
||||
}
|
||||
|
||||
public Keyboard()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
SetKeyCombo(comboM3, textM3, "m3");
|
||||
SetKeyCombo(comboM4, textM4, "m4");
|
||||
SetKeyCombo(comboFNF4, textFNF4, "fnf4");
|
||||
|
||||
Shown += Keyboard_Shown;
|
||||
}
|
||||
|
||||
|
||||
private void Keyboard_Shown(object? sender, EventArgs e)
|
||||
{
|
||||
Top = Program.settingsForm.Top;
|
||||
Left = Program.settingsForm.Left - Width - 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Serge
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
368
NativeMethods.cs
@@ -1,368 +0,0 @@
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
|
||||
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;
|
||||
public const int VK_SNAPSHOT = 0x2C;
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
|
||||
|
||||
public static void KeyPress(int key = VK_MEDIA_PLAY_PAUSE)
|
||||
{
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
}
|
||||
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
|
||||
public const int SW_RESTORE = 9;
|
||||
|
||||
public static bool SwitchToCurrent()
|
||||
{
|
||||
IntPtr hWnd = IntPtr.Zero;
|
||||
Process process = Process.GetCurrentProcess();
|
||||
Process[] processes = Process.GetProcessesByName(process.ProcessName);
|
||||
foreach (Process _process in processes)
|
||||
{
|
||||
if (_process.Id != process.Id)
|
||||
{
|
||||
|
||||
if (_process.MainWindowHandle != IntPtr.Zero)
|
||||
{
|
||||
Debug.WriteLine(_process.Id);
|
||||
Debug.WriteLine(process.Id);
|
||||
|
||||
hWnd = _process.MainWindowHandle;
|
||||
ShowWindowAsync(hWnd, SW_RESTORE);
|
||||
}
|
||||
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
int AcValueIndex);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
int AcValueIndex);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerReadACValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
out IntPtr AcValueIndex
|
||||
);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
out IntPtr AcValueIndex
|
||||
);
|
||||
|
||||
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid);
|
||||
|
||||
static readonly Guid GUID_CPU = new Guid("54533251-82be-4824-96c1-47b60b740d00");
|
||||
static readonly Guid GUID_BOOST = new Guid("be337238-0d82-4146-a960-4f3749d470c7");
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public struct DEVMODE
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string dmDeviceName;
|
||||
|
||||
public short dmSpecVersion;
|
||||
public short dmDriverVersion;
|
||||
public short dmSize;
|
||||
public short dmDriverExtra;
|
||||
public int dmFields;
|
||||
public int dmPositionX;
|
||||
public int dmPositionY;
|
||||
public int dmDisplayOrientation;
|
||||
public int dmDisplayFixedOutput;
|
||||
public short dmColor;
|
||||
public short dmDuplex;
|
||||
public short dmYResolution;
|
||||
public short dmTTOption;
|
||||
public short dmCollate;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string dmFormName;
|
||||
|
||||
public short dmLogPixels;
|
||||
public short dmBitsPerPel;
|
||||
public int dmPelsWidth;
|
||||
public int dmPelsHeight;
|
||||
public int dmDisplayFlags;
|
||||
public int dmDisplayFrequency;
|
||||
public int dmICMMethod;
|
||||
public int dmICMIntent;
|
||||
public int dmMediaType;
|
||||
public int dmDitherType;
|
||||
public int dmReserved1;
|
||||
public int dmReserved2;
|
||||
public int dmPanningWidth;
|
||||
public int dmPanningHeight;
|
||||
};
|
||||
|
||||
[Flags()]
|
||||
public enum DisplaySettingsFlags : int
|
||||
{
|
||||
CDS_UPDATEREGISTRY = 1,
|
||||
CDS_TEST = 2,
|
||||
CDS_FULLSCREEN = 4,
|
||||
CDS_GLOBAL = 8,
|
||||
CDS_SET_PRIMARY = 0x10,
|
||||
CDS_RESET = 0x40000000,
|
||||
CDS_NORESET = 0x10000000
|
||||
}
|
||||
|
||||
// PInvoke declaration for EnumDisplaySettings Win32 API
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int EnumDisplaySettingsEx(
|
||||
string lpszDeviceName,
|
||||
int iModeNum,
|
||||
ref DEVMODE lpDevMode);
|
||||
|
||||
// PInvoke declaration for ChangeDisplaySettings Win32 API
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int ChangeDisplaySettingsEx(
|
||||
string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd,
|
||||
DisplaySettingsFlags dwflags, IntPtr lParam);
|
||||
|
||||
// ENUM DISPLAYS
|
||||
[DllImport("user32.dll")]
|
||||
static extern bool EnumDisplayDevicesA(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags);
|
||||
|
||||
[Flags()]
|
||||
public enum DisplayDeviceStateFlags : int
|
||||
{
|
||||
AttachedToDesktop = 0x1,
|
||||
MultiDriver = 0x2,
|
||||
PrimaryDevice = 0x4,
|
||||
MirroringDriver = 0x8,
|
||||
VGACompatible = 0x10,
|
||||
Removable = 0x20,
|
||||
ModesPruned = 0x8000000,
|
||||
Remote = 0x4000000,
|
||||
Disconnect = 0x2000000
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public struct DISPLAY_DEVICE
|
||||
{
|
||||
[MarshalAs(UnmanagedType.U4)]
|
||||
public int cb;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string DeviceName;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||
public string DeviceString;
|
||||
[MarshalAs(UnmanagedType.U4)]
|
||||
public DisplayDeviceStateFlags StateFlags;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||
public string DeviceID;
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||
public string DeviceKey;
|
||||
}
|
||||
|
||||
// ----
|
||||
|
||||
public static DEVMODE CreateDevmode()
|
||||
{
|
||||
DEVMODE dm = new DEVMODE();
|
||||
dm.dmDeviceName = new String(new char[32]);
|
||||
dm.dmFormName = new String(new char[32]);
|
||||
dm.dmSize = (short)Marshal.SizeOf(dm);
|
||||
return dm;
|
||||
}
|
||||
|
||||
public const int ENUM_CURRENT_SETTINGS = -1;
|
||||
public const string laptopScreenName = "\\\\.\\DISPLAY1";
|
||||
|
||||
public static string FindLaptopScreen()
|
||||
{
|
||||
string laptopScreen = null;
|
||||
|
||||
DISPLAY_DEVICE d = new DISPLAY_DEVICE();
|
||||
d.cb = Marshal.SizeOf(d);
|
||||
|
||||
List<string> activeScreens = new List<string>();
|
||||
int counter = 0;
|
||||
int deviceNum = -1;
|
||||
|
||||
try
|
||||
{
|
||||
var searcherActive = new ManagementObjectSearcher(@"\\.\root\wmi", "SELECT * FROM WmiMonitorBasicDisplayParams");
|
||||
var resultsActive = searcherActive.Get();
|
||||
foreach (var result in resultsActive)
|
||||
{
|
||||
activeScreens.Add(result["InstanceName"].ToString());
|
||||
}
|
||||
|
||||
var searcher = new ManagementObjectSearcher(@"\\.\root\wmi", "SELECT * FROM WmiMonitorConnectionParams");
|
||||
var results = searcher.Get();
|
||||
|
||||
|
||||
foreach (var result in results)
|
||||
{
|
||||
long technology;
|
||||
long.TryParse(result["VideoOutputTechnology"].ToString(), out technology);
|
||||
string instanceName = result["InstanceName"].ToString();
|
||||
|
||||
if (technology == 0x80000000 && activeScreens.Contains(instanceName))
|
||||
{
|
||||
deviceNum = counter;
|
||||
//Debug.WriteLine(result["InstanceName"]);
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
} catch
|
||||
{
|
||||
Debug.WriteLine("Failed to detect built in display");
|
||||
deviceNum = 0;
|
||||
}
|
||||
|
||||
counter = 0;
|
||||
for (uint id = 0; EnumDisplayDevicesA(null, id, ref d, 0); id++)
|
||||
{
|
||||
if ((d.StateFlags & DisplayDeviceStateFlags.AttachedToDesktop) != 0)
|
||||
{
|
||||
//Debug.WriteLine(d.DeviceID);
|
||||
//Debug.WriteLine(d.DeviceName);
|
||||
if (counter == deviceNum)
|
||||
{
|
||||
laptopScreen = d.DeviceName;
|
||||
}
|
||||
counter++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Mismatch between active screens and enumerated screens, fallback to old method
|
||||
if (counter != activeScreens.Count)
|
||||
{
|
||||
laptopScreen = null;
|
||||
foreach (var screen in Screen.AllScreens)
|
||||
if (screen.DeviceName == laptopScreenName)
|
||||
laptopScreen = screen.DeviceName;
|
||||
}
|
||||
|
||||
return laptopScreen;
|
||||
}
|
||||
|
||||
public static int GetRefreshRate()
|
||||
{
|
||||
DEVMODE dm = CreateDevmode();
|
||||
|
||||
string laptopScreen = FindLaptopScreen();
|
||||
int frequency = -1;
|
||||
|
||||
if (laptopScreen is null)
|
||||
return -1;
|
||||
|
||||
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
|
||||
{
|
||||
frequency = dm.dmDisplayFrequency;
|
||||
}
|
||||
|
||||
return frequency;
|
||||
}
|
||||
|
||||
public static int SetRefreshRate(int frequency = 120)
|
||||
{
|
||||
DEVMODE dm = CreateDevmode();
|
||||
string laptopScreen = FindLaptopScreen();
|
||||
|
||||
if (laptopScreen is null)
|
||||
return -1;
|
||||
|
||||
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
|
||||
{
|
||||
dm.dmDisplayFrequency = frequency;
|
||||
int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
||||
return iRet;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static Guid GetActiveScheme()
|
||||
{
|
||||
IntPtr pActiveSchemeGuid;
|
||||
var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid);
|
||||
Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid));
|
||||
return activeSchemeGuid;
|
||||
}
|
||||
|
||||
public static int GetCPUBoost()
|
||||
{
|
||||
IntPtr AcValueIndex;
|
||||
Guid activeSchemeGuid = GetActiveScheme();
|
||||
|
||||
UInt32 value = PowerReadACValueIndex(IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST, out AcValueIndex);
|
||||
|
||||
return AcValueIndex.ToInt32();
|
||||
|
||||
}
|
||||
|
||||
public static void SetCPUBoost(int boost = 0)
|
||||
{
|
||||
Guid activeSchemeGuid = GetActiveScheme();
|
||||
|
||||
var hrAC = PowerWriteACValueIndex(
|
||||
IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST,
|
||||
boost);
|
||||
|
||||
PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);
|
||||
|
||||
var hrDC = PowerWriteDCValueIndex(
|
||||
IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST,
|
||||
boost);
|
||||
|
||||
PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"profiles": {
|
||||
"GHelper": {
|
||||
"commandName": "Project",
|
||||
"workingDirectory": "C:\\Users\\serge\\source\\GHelper"
|
||||
}
|
||||
}
|
||||
}
|
||||
68
README.md
@@ -1,68 +0,0 @@
|
||||
# G-Helper (For Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, and others)
|
||||
|
||||
A small utility that allows you do almost everyting you could do with Armory Crate but without extra bloat and unnecessary services.
|
||||
|
||||
## NEW (and experimental) features
|
||||
|
||||
1. Set Power limits (PPT) for Total (APU + dGPU) and CPU.
|
||||
2. Anime matrix control thanks to https://github.com/vddCore/Starlight
|
||||
|
||||
## Main features
|
||||
|
||||
1. Switch between built-in system **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 health
|
||||
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 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 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)
|
||||
|
||||

|
||||
|
||||
## Performance Profile switching
|
||||
|
||||
Profiles are **same** as in Armory Crate (as they are stored in bios), including default fan curves
|
||||
|
||||
1. Silent (minimal or no fans, 70W PPT total, up to 45W PPT to CPU)
|
||||
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)
|
||||
|
||||
PPTs are shown for G14 2022, for other models PPTs will be different as they are set in bios.
|
||||
|
||||
## GPU Modes
|
||||
|
||||
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)
|
||||
|
||||
## How to install
|
||||
|
||||
1. Download latest release from https://github.com/seerge/g-helper/releases
|
||||
2. Unzip to a folder of your choice
|
||||
3. Run **GHelper.exe**
|
||||
|
||||
Note: Uses low level ASUS ACPI commands and doens't require Armory Crate to be installed at all! Doesn't need administrator privileges to run!
|
||||
|
||||
I don`t have Microsoft certificate to sign app yet, so if you get a warning from Windows Defender on launch (Windows Protected your PC), click More Info -> Run anyway. Alternatively you can compile and run project by yourself using Visual Studio :)
|
||||
|
||||
Settings file is stored at %AppData%\GHelper
|
||||
|
||||
P.S.: It's not recommended to use app in combination with Armory Crate, cause they adjust same settings.
|
||||
|
||||
------------------
|
||||
|
||||
Debloating helps to save your battery and keep laptop a bit cooler
|
||||
|
||||

|
||||
1034
Settings.cs
42
Startup.cs
@@ -1,42 +0,0 @@
|
||||
using Microsoft.Win32.TaskScheduler;
|
||||
using System.Diagnostics;
|
||||
using System.Security.Principal;
|
||||
|
||||
public class Startup
|
||||
{
|
||||
|
||||
static string taskName = "GHelper";
|
||||
|
||||
public static bool IsScheduled()
|
||||
{
|
||||
TaskService taskService = new TaskService();
|
||||
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
|
||||
}
|
||||
|
||||
public static void Schedule()
|
||||
{
|
||||
|
||||
string strExeFilePath = Application.ExecutablePath;
|
||||
|
||||
if (strExeFilePath is null) return;
|
||||
|
||||
var userId = WindowsIdentity.GetCurrent().Name;
|
||||
|
||||
//Debug.WriteLine(strExeFilePath);
|
||||
TaskDefinition td = TaskService.Instance.NewTask();
|
||||
td.RegistrationInfo.Description = "GHelper Auto Start";
|
||||
td.Triggers.Add(new LogonTrigger { UserId = userId, });
|
||||
td.Actions.Add(strExeFilePath);
|
||||
|
||||
td.Settings.StopIfGoingOnBatteries = false;
|
||||
td.Settings.DisallowStartIfOnBatteries = false;
|
||||
|
||||
TaskService.Instance.RootFolder.RegisterTaskDefinition(taskName, td);
|
||||
}
|
||||
|
||||
public static void UnSchedule()
|
||||
{
|
||||
TaskService taskService = new TaskService();
|
||||
taskService.RootFolder.DeleteTask(taskName);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,6 @@
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
using System.Management;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
|
||||
public class ASUSWmi
|
||||
{
|
||||
|
||||
@@ -12,26 +10,46 @@ public class ASUSWmi
|
||||
const uint DSTS = 0x53545344;
|
||||
const uint DEVS = 0x53564544;
|
||||
|
||||
public const uint UniversalControl = 0x00100021;
|
||||
public const int KB_Light_Up = 0xc4;
|
||||
public const int KB_Light_Down = 0xc5;
|
||||
|
||||
public const uint CPU_Fan = 0x00110013;
|
||||
public const uint GPU_Fan = 0x00110014;
|
||||
public const uint Mid_Fan = 0x00110031;
|
||||
|
||||
public const uint PerformanceMode = 0x00120075; // Thermal Control
|
||||
|
||||
public const uint GPUEco = 0x00090020;
|
||||
public const uint GPUXGConnected = 0x00090018;
|
||||
public const uint GPUXG = 0x00090019;
|
||||
public const uint GPUMux = 0x00090016;
|
||||
|
||||
public const uint BatteryLimit = 0x00120057;
|
||||
public const uint ScreenOverdrive = 0x00050019;
|
||||
public const uint ScreenMiniled = 0x0005001E;
|
||||
|
||||
public const uint DevsCPUFanCurve = 0x00110024;
|
||||
public const uint DevsGPUFanCurve = 0x00110025;
|
||||
public const uint DevsMidFanCurve = 0x00110032;
|
||||
|
||||
public const int PPT_TotalA0 = 0x001200A0;
|
||||
public const int PPT_TotalA1 = 0x001200A1;
|
||||
public const int Temp_CPU = 0x00120094;
|
||||
public const int Temp_GPU = 0x00120097;
|
||||
|
||||
public const int PPT_CPUB0 = 0x001200B0;
|
||||
public const int PPT_CPUB1 = 0x001200B1;
|
||||
public const int PPT_CPUA2 = 0x001200A2;
|
||||
|
||||
public const int PPT_TotalA0 = 0x001200A0; // Total PPT on 2022 and CPU PPT on 2021
|
||||
public const int PPT_EDCA1 = 0x001200A1; // CPU EDC
|
||||
public const int PPT_TDCA2 = 0x001200A2; // CPU TDC
|
||||
public const int PPT_APUA3 = 0x001200A3; // APU PPT ON 2021, doesn't work on 2022
|
||||
|
||||
public const int PPT_CPUB0 = 0x001200B0; // CPU PPT on 2022
|
||||
public const int PPT_CPUB1 = 0x001200B1; // APU PPT on 2022
|
||||
|
||||
public const int PPT_APUC1 = 0x001200C1;
|
||||
public const int PPT_APUC2 = 0x001200C2;
|
||||
|
||||
public const int TUF_KB = 0x00100056;
|
||||
public const int TUF_KB_STATE = 0x00100057;
|
||||
|
||||
public const int PerformanceBalanced = 0;
|
||||
public const int PerformanceTurbo = 1;
|
||||
@@ -42,6 +60,15 @@ public class ASUSWmi
|
||||
public const int GPUModeUltimate = 2;
|
||||
|
||||
|
||||
public const int MaxTotal = 200;
|
||||
public const int MinTotal = 5;
|
||||
public const int DefaultTotal = 125;
|
||||
|
||||
public const int MaxCPU = 130;
|
||||
public const int MinCPU = 5;
|
||||
public const int DefaultCPU = 80;
|
||||
|
||||
|
||||
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
private static extern IntPtr CreateFile(
|
||||
string lpFileName,
|
||||
@@ -132,21 +159,31 @@ public class ASUSWmi
|
||||
|
||||
}
|
||||
|
||||
public void DeviceSet(uint DeviceID, int Status)
|
||||
public int DeviceSet(uint DeviceID, int Status, string logName)
|
||||
{
|
||||
byte[] args = new byte[8];
|
||||
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
|
||||
BitConverter.GetBytes((uint)Status).CopyTo(args, 4);
|
||||
CallMethod(DEVS, args);
|
||||
|
||||
byte[] status = CallMethod(DEVS, args);
|
||||
int result = BitConverter.ToInt32(status, 0);
|
||||
|
||||
Logger.WriteLine(logName + " = " + Status + " : " + (result == 1 ? "OK" : result));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public void DeviceSet(uint DeviceID, byte[] Params)
|
||||
public int DeviceSet(uint DeviceID, byte[] Params, string logName)
|
||||
{
|
||||
byte[] args = new byte[4 + Params.Length];
|
||||
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
|
||||
Params.CopyTo(args, 4);
|
||||
CallMethod(DEVS, args);
|
||||
|
||||
byte[] status = CallMethod(DEVS, args);
|
||||
int result = BitConverter.ToInt32(status, 0);
|
||||
|
||||
Logger.WriteLine(logName + " = " + BitConverter.ToString(Params) + " : " + (result == 1 ? "OK" : result));
|
||||
return BitConverter.ToInt32(status, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -155,7 +192,9 @@ public class ASUSWmi
|
||||
byte[] args = new byte[8];
|
||||
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
|
||||
byte[] status = CallMethod(DSTS, args);
|
||||
|
||||
return BitConverter.ToInt32(status, 0) - 65536;
|
||||
|
||||
}
|
||||
|
||||
public byte[] DeviceGetBuffer(uint DeviceID, uint Status = 0)
|
||||
@@ -163,22 +202,38 @@ public class ASUSWmi
|
||||
byte[] args = new byte[8];
|
||||
BitConverter.GetBytes((uint)DeviceID).CopyTo(args, 0);
|
||||
BitConverter.GetBytes((uint)Status).CopyTo(args, 4);
|
||||
|
||||
return CallMethod(DSTS, args);
|
||||
}
|
||||
|
||||
|
||||
public void SetFanCurve(int device, byte[] curve)
|
||||
public int SetFanCurve(int device, byte[] curve)
|
||||
{
|
||||
|
||||
if (curve.Length != 16) return;
|
||||
if (curve.All(singleByte => singleByte == 0)) return;
|
||||
if (curve.Length != 16) return -1;
|
||||
if (curve.All(singleByte => singleByte == 0)) return -1;
|
||||
|
||||
Debug.WriteLine(BitConverter.ToString(curve));
|
||||
int result;
|
||||
|
||||
if (device == 1)
|
||||
DeviceSet(DevsGPUFanCurve, curve);
|
||||
else
|
||||
DeviceSet(DevsCPUFanCurve, curve);
|
||||
for (int i = 8; i < curve.Length; i++)
|
||||
{
|
||||
curve[i] = Math.Max((byte)0, Math.Min((byte)99, curve[i])); // it seems to be a bug, when some old model's bios can go nuts if fan is set to 100%
|
||||
}
|
||||
|
||||
switch (device)
|
||||
{
|
||||
case 1:
|
||||
result = DeviceSet(DevsGPUFanCurve, curve, "FanGPU");
|
||||
break;
|
||||
case 2:
|
||||
result = DeviceSet(DevsMidFanCurve, curve, "FanMid");
|
||||
break;
|
||||
default:
|
||||
result = DeviceSet(DevsCPUFanCurve, curve, "FanCPU");
|
||||
break;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public byte[] GetFanCurve(int device, int mode = 0)
|
||||
@@ -193,20 +248,65 @@ public class ASUSWmi
|
||||
default: fan_mode = 0; break;
|
||||
}
|
||||
|
||||
if (device == 1)
|
||||
return DeviceGetBuffer(DevsGPUFanCurve, fan_mode);
|
||||
else
|
||||
return DeviceGetBuffer(DevsCPUFanCurve, fan_mode);
|
||||
switch (device)
|
||||
{
|
||||
case 1:
|
||||
return DeviceGetBuffer(DevsGPUFanCurve, fan_mode);
|
||||
case 2:
|
||||
return DeviceGetBuffer(DevsMidFanCurve, fan_mode);
|
||||
default:
|
||||
return DeviceGetBuffer(DevsCPUFanCurve, fan_mode);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void TUFKeyboardRGB(int mode, Color color, int speed)
|
||||
{
|
||||
|
||||
byte[] setting = new byte[12];
|
||||
setting[0] = (byte)1;
|
||||
setting[1] = (byte)mode;
|
||||
setting[2] = color.R;
|
||||
setting[3] = color.G;
|
||||
setting[4] = color.B;
|
||||
setting[5] = (byte)speed;
|
||||
|
||||
DeviceSet(TUF_KB, setting, "TUF RGB");
|
||||
//Debug.WriteLine(BitConverter.ToString(setting));
|
||||
|
||||
}
|
||||
|
||||
const int ASUS_WMI_KEYBOARD_POWER_BOOT = 0x03 << 16;
|
||||
const int ASUS_WMI_KEYBOARD_POWER_AWAKE = 0x0C << 16;
|
||||
const int ASUS_WMI_KEYBOARD_POWER_SLEEP = 0x30 << 16;
|
||||
const int ASUS_WMI_KEYBOARD_POWER_SHUTDOWN = 0xC0 << 16;
|
||||
public void TUFKeyboardPower(bool awake = true, bool boot = false, bool sleep = false, bool shutdown = false)
|
||||
{
|
||||
int state = 0xbd;
|
||||
|
||||
if (boot) state = state | ASUS_WMI_KEYBOARD_POWER_BOOT;
|
||||
if (awake) state = state | ASUS_WMI_KEYBOARD_POWER_AWAKE;
|
||||
if (sleep) state = state | ASUS_WMI_KEYBOARD_POWER_SLEEP;
|
||||
if (shutdown) state = state | ASUS_WMI_KEYBOARD_POWER_SHUTDOWN;
|
||||
|
||||
state = state | 0x01 << 8;
|
||||
|
||||
DeviceSet(TUF_KB_STATE, state, "TUF_KB");
|
||||
}
|
||||
|
||||
public void SubscribeToEvents(Action<object, EventArrivedEventArgs> EventHandler)
|
||||
{
|
||||
ManagementEventWatcher watcher = new ManagementEventWatcher();
|
||||
watcher.EventArrived += new EventArrivedEventHandler(EventHandler);
|
||||
watcher.Scope = new ManagementScope("root\\wmi");
|
||||
watcher.Query = new WqlEventQuery("SELECT * FROM AsusAtkWmiEvent");
|
||||
watcher.Start();
|
||||
try
|
||||
{
|
||||
ManagementEventWatcher watcher = new ManagementEventWatcher();
|
||||
watcher.EventArrived += new EventArrivedEventHandler(EventHandler);
|
||||
watcher.Scope = new ManagementScope("root\\wmi");
|
||||
watcher.Query = new WqlEventQuery("SELECT * FROM AsusAtkWmiEvent");
|
||||
watcher.Start();
|
||||
} catch
|
||||
{
|
||||
Logger.WriteLine("Can't connect to ASUS WMI events");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
458
app/AnimeMatrix/AnimeMatrixDevice.cs
Normal file
@@ -0,0 +1,458 @@
|
||||
// Source thanks to https://github.com/vddCore/Starlight with some adjustments from me
|
||||
|
||||
using Starlight.Communication;
|
||||
using System.Management;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Text;
|
||||
using System.Globalization;
|
||||
using System;
|
||||
|
||||
namespace Starlight.AnimeMatrix
|
||||
{
|
||||
public class BuiltInAnimation
|
||||
{
|
||||
public enum Startup
|
||||
{
|
||||
GlitchConstruction,
|
||||
StaticEmergence
|
||||
}
|
||||
|
||||
public enum Shutdown
|
||||
{
|
||||
GlitchOut,
|
||||
SeeYa
|
||||
}
|
||||
|
||||
public enum Sleeping
|
||||
{
|
||||
BannerSwipe,
|
||||
Starfield
|
||||
}
|
||||
|
||||
public enum Running
|
||||
{
|
||||
BinaryBannerScroll,
|
||||
RogLogoGlitch
|
||||
}
|
||||
|
||||
public byte AsByte { get; }
|
||||
|
||||
public BuiltInAnimation(
|
||||
Running running,
|
||||
Sleeping sleeping,
|
||||
Shutdown shutdown,
|
||||
Startup startup
|
||||
)
|
||||
{
|
||||
AsByte |= (byte)(((int)running & 0x01) << 0);
|
||||
AsByte |= (byte)(((int)sleeping & 0x01) << 1);
|
||||
AsByte |= (byte)(((int)shutdown & 0x01) << 2);
|
||||
AsByte |= (byte)(((int)startup & 0x01) << 3);
|
||||
}
|
||||
}
|
||||
|
||||
internal class AnimeMatrixPacket : Packet
|
||||
{
|
||||
public AnimeMatrixPacket(byte[] command)
|
||||
: base(0x5E, 640, command)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public enum AnimeType
|
||||
{
|
||||
GA401,
|
||||
GA402
|
||||
}
|
||||
|
||||
|
||||
|
||||
public enum BrightnessMode : byte
|
||||
{
|
||||
Off = 0,
|
||||
Dim = 1,
|
||||
Medium = 2,
|
||||
Full = 3
|
||||
}
|
||||
|
||||
|
||||
public class AnimeMatrixDevice : Device
|
||||
{
|
||||
int UpdatePageLength = 490;
|
||||
int LedCount = 1450;
|
||||
|
||||
byte[] _displayBuffer;
|
||||
List<byte[]> frames = new List<byte[]>();
|
||||
|
||||
public int MaxRows = 61;
|
||||
//public int FullRows = 11;
|
||||
//public int FullEvenRows = -1;
|
||||
|
||||
public int dx = 0;
|
||||
public int MaxColumns = 34;
|
||||
|
||||
private int frameIndex = 0;
|
||||
|
||||
private static AnimeType _model = AnimeType.GA402;
|
||||
|
||||
public AnimeMatrixDevice()
|
||||
: base(0x0B05, 0x193B, 640)
|
||||
{
|
||||
string model = GetModel();
|
||||
if (model.Contains("401"))
|
||||
{
|
||||
|
||||
_model = AnimeType.GA401;
|
||||
|
||||
MaxColumns = 33;
|
||||
dx = 1;
|
||||
|
||||
//FullRows = 7;
|
||||
//FullEvenRows = 3;
|
||||
|
||||
MaxRows = 55;
|
||||
LedCount = 1245;
|
||||
|
||||
UpdatePageLength = 410;
|
||||
}
|
||||
|
||||
|
||||
_displayBuffer = new byte[LedCount];
|
||||
|
||||
}
|
||||
|
||||
|
||||
public string GetModel()
|
||||
{
|
||||
using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_ComputerSystem"))
|
||||
{
|
||||
foreach (var process in searcher.Get())
|
||||
return process["Model"].ToString();
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
public byte[] GetBuffer()
|
||||
{
|
||||
return _displayBuffer;
|
||||
}
|
||||
|
||||
public void PresentNextFrame()
|
||||
{
|
||||
if (frameIndex >= frames.Count) frameIndex = 0;
|
||||
_displayBuffer = frames[frameIndex];
|
||||
Present();
|
||||
frameIndex++;
|
||||
}
|
||||
|
||||
public void ClearFrames()
|
||||
{
|
||||
frames.Clear();
|
||||
frameIndex = 0;
|
||||
}
|
||||
|
||||
public void AddFrame()
|
||||
{
|
||||
frames.Add(_displayBuffer.ToArray());
|
||||
}
|
||||
|
||||
public void SendRaw(params byte[] data)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(data));
|
||||
}
|
||||
|
||||
|
||||
public static int FirstX(int y)
|
||||
{
|
||||
switch (_model)
|
||||
{
|
||||
case AnimeType.GA401:
|
||||
if (y < 5)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (y + 1) / 2 - 3;
|
||||
}
|
||||
case AnimeType.GA402:
|
||||
if (y < 11)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return (y) / 2 - 5;
|
||||
}
|
||||
default:
|
||||
throw new ArgumentException("Invalid anime type", nameof(_model));
|
||||
}
|
||||
}
|
||||
|
||||
public static int Width(int y)
|
||||
{
|
||||
switch (_model)
|
||||
{
|
||||
case AnimeType.GA401:
|
||||
return 33;
|
||||
case AnimeType.GA402:
|
||||
return 34;
|
||||
default:
|
||||
throw new ArgumentException("Invalid anime type", nameof(_model));
|
||||
}
|
||||
}
|
||||
|
||||
public static int Pitch(int y)
|
||||
{
|
||||
switch (_model)
|
||||
{
|
||||
case AnimeType.GA401:
|
||||
switch (y)
|
||||
{
|
||||
case 0:
|
||||
case 2:
|
||||
case 4:
|
||||
return 33;
|
||||
case 1:
|
||||
case 3:
|
||||
return 35;
|
||||
default:
|
||||
return 36 - y / 2;
|
||||
}
|
||||
case AnimeType.GA402:
|
||||
return Width(y) - FirstX(y);
|
||||
default:
|
||||
throw new ArgumentException("Invalid anime type", nameof(_model));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
public int XStart(int row)
|
||||
{
|
||||
return (int)Math.Ceiling(Math.Max(0, row - FullRows) / 2.0);
|
||||
}
|
||||
|
||||
public int XEnd(int row)
|
||||
{
|
||||
if (row <= FullEvenRows)
|
||||
{
|
||||
if (row % 2 == 1) return MaxColumns + 2;
|
||||
else return MaxColumns;
|
||||
}
|
||||
return MaxColumns;
|
||||
}
|
||||
*/
|
||||
|
||||
public int RowToLinearAddress(int y)
|
||||
{
|
||||
EnsureRowInRange(y);
|
||||
|
||||
int ret = 0;
|
||||
|
||||
for (var i = 0; i < y; i++)
|
||||
ret += Pitch(i);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
public void SetLedPlanar(int x, int y, byte value)
|
||||
{
|
||||
EnsureRowInRange(y);
|
||||
|
||||
if (x >= FirstX(y) && x < Width(y))
|
||||
{
|
||||
SetLedLinear(RowToLinearAddress(y) - FirstX(y) + x + dx, value);
|
||||
//Debug.Write((RowToLinearAddress(y) - FirstX(y) + x + dx).ToString() + " ");
|
||||
}
|
||||
}
|
||||
|
||||
public void WakeUp()
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(Encoding.ASCII.GetBytes("ASUS Tech.Inc.")));
|
||||
}
|
||||
|
||||
public void SetLedLinear(int address, byte value)
|
||||
{
|
||||
if (!IsAddressableLed(address)) return;
|
||||
_displayBuffer[address] = value;
|
||||
}
|
||||
|
||||
public void SetLedLinearImmediate(int address, byte value)
|
||||
{
|
||||
if (!IsAddressableLed(address)) return;
|
||||
_displayBuffer[address] = value;
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(address + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)0x0001))
|
||||
.AppendData(value)
|
||||
);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void Clear(bool present = false)
|
||||
{
|
||||
for (var i = 0; i < _displayBuffer.Length; i++)
|
||||
_displayBuffer[i] = 0;
|
||||
|
||||
if (present)
|
||||
Present();
|
||||
}
|
||||
|
||||
public void Present()
|
||||
{
|
||||
|
||||
int page = 0;
|
||||
int start, end;
|
||||
|
||||
while (page * UpdatePageLength < LedCount)
|
||||
{
|
||||
start = page * UpdatePageLength;
|
||||
end = Math.Min(LedCount, (page + 1) * UpdatePageLength);
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x02)
|
||||
.AppendData(BitConverter.GetBytes((ushort)(start + 1)))
|
||||
.AppendData(BitConverter.GetBytes((ushort)(end - start)))
|
||||
.AppendData(_displayBuffer[start..end])
|
||||
);
|
||||
|
||||
page++;
|
||||
}
|
||||
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x03));
|
||||
}
|
||||
|
||||
public void SetDisplayState(bool enable)
|
||||
{
|
||||
if (enable)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
|
||||
.AppendData(0x00));
|
||||
}
|
||||
else
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC3, 0x01)
|
||||
.AppendData(0x80));
|
||||
}
|
||||
}
|
||||
|
||||
public void SetBrightness(BrightnessMode mode)
|
||||
{
|
||||
Set(Packet<AnimeMatrixPacket>(0xC0, 0x04)
|
||||
.AppendData((byte)mode)
|
||||
);
|
||||
}
|
||||
|
||||
public void SetBuiltInAnimation(bool enable)
|
||||
{
|
||||
var enabled = enable ? (byte)0x00 : (byte)0x80;
|
||||
Set(Packet<AnimeMatrixPacket>(0xC4, 0x01, enabled));
|
||||
}
|
||||
|
||||
public void SetBuiltInAnimation(bool enable, BuiltInAnimation animation)
|
||||
{
|
||||
SetBuiltInAnimation(enable);
|
||||
Set(Packet<AnimeMatrixPacket>(0xC5, animation.AsByte));
|
||||
}
|
||||
|
||||
|
||||
public void PresentClock()
|
||||
{
|
||||
int second = DateTime.Now.Second;
|
||||
|
||||
if (CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern.Contains("H"))
|
||||
PresentText(DateTime.Now.ToString("H" + ((second % 2 == 0)?":":" ") + "mm"));
|
||||
else
|
||||
PresentText(DateTime.Now.ToString("h" + ((second % 2 == 0) ? ":" : " ") + "mm"), DateTime.Now.ToString("tt"));
|
||||
}
|
||||
|
||||
public void PresentText(string text1, string text2 = "")
|
||||
{
|
||||
using (Bitmap bmp = new Bitmap(MaxColumns * 3, MaxRows))
|
||||
{
|
||||
using (Graphics g = Graphics.FromImage(bmp))
|
||||
{
|
||||
g.CompositingQuality = CompositingQuality.HighQuality;
|
||||
g.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
using (Font font = new Font("Arial", 12F))
|
||||
{
|
||||
SizeF textSize = g.MeasureString(text1, font);
|
||||
g.DrawString(text1, font, Brushes.White, (MaxColumns*3 - textSize.Width)+3, -5);
|
||||
}
|
||||
|
||||
if (text2.Length > 0)
|
||||
using (Font font = new Font("Arial", 9F))
|
||||
{
|
||||
SizeF textSize = g.MeasureString(text2, font);
|
||||
g.DrawString(text2, font, Brushes.White, (MaxColumns * 3 - textSize.Width)+1, 25);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
GenerateFrame(bmp, InterpolationMode.Bicubic);
|
||||
Present();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void GenerateFrame(Image image, InterpolationMode interpolation = InterpolationMode.High)
|
||||
{
|
||||
|
||||
int width = MaxColumns/2 * 6;
|
||||
int height = MaxRows;
|
||||
|
||||
int targetWidth = MaxColumns * 2;
|
||||
|
||||
float scale;
|
||||
|
||||
using (Bitmap bmp = new Bitmap(targetWidth, height))
|
||||
{
|
||||
scale = Math.Min((float)width / (float)image.Width, (float)height / (float)image.Height);
|
||||
|
||||
using (var graph = Graphics.FromImage(bmp))
|
||||
{
|
||||
var scaleWidth = (float)(image.Width * scale);
|
||||
var scaleHeight = (float)(image.Height * scale);
|
||||
|
||||
graph.InterpolationMode = interpolation;
|
||||
graph.CompositingQuality = CompositingQuality.HighQuality;
|
||||
graph.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
|
||||
graph.DrawImage(image, (float)Math.Round(targetWidth - scaleWidth * targetWidth / width), 0, (float)Math.Round(scaleWidth * targetWidth / width), scaleHeight);
|
||||
|
||||
}
|
||||
|
||||
for (int y = 0; y < bmp.Height; y++)
|
||||
{
|
||||
for (int x = 0; x < bmp.Width; x++)
|
||||
if (x % 2 == (y+dx) % 2)
|
||||
{
|
||||
var pixel = bmp.GetPixel(x, y);
|
||||
var color = (pixel.R + pixel.G + pixel.B) / 3;
|
||||
if (color < 10) color = 0;
|
||||
SetLedPlanar(x / 2, y, (byte)color);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureRowInRange(int row)
|
||||
{
|
||||
if (row < 0 || row >= MaxRows)
|
||||
{
|
||||
throw new IndexOutOfRangeException($"Y-coordinate should fall in range of [0, {MaxRows - 1}].");
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsAddressableLed(int address)
|
||||
{
|
||||
return (address >= 0 && address < LedCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,4 +3,8 @@
|
||||
<System.Windows.Forms.ApplicationConfigurationSection>
|
||||
<add key="DpiAwareness" value="PerMonitorV2" />
|
||||
</System.Windows.Forms.ApplicationConfigurationSection>
|
||||
</configuration>
|
||||
<appSettings>
|
||||
<add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
|
||||
</appSettings>
|
||||
</configuration>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Text.Json;
|
||||
using System.Management;
|
||||
using System.Text.Json;
|
||||
|
||||
public class AppConfig
|
||||
{
|
||||
@@ -6,6 +7,8 @@ public class AppConfig
|
||||
public string appPath;
|
||||
string configFile;
|
||||
|
||||
string _model;
|
||||
|
||||
public Dictionary<string, object> config = new Dictionary<string, object>();
|
||||
|
||||
public AppConfig()
|
||||
@@ -36,6 +39,31 @@ public class AppConfig
|
||||
|
||||
}
|
||||
|
||||
|
||||
public string GetModel()
|
||||
{
|
||||
if (_model is null)
|
||||
{
|
||||
_model = "";
|
||||
using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_ComputerSystem"))
|
||||
{
|
||||
foreach (var process in searcher.Get())
|
||||
{
|
||||
_model = process["Model"].ToString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _model;
|
||||
}
|
||||
public bool ContainsModel(string contains)
|
||||
{
|
||||
|
||||
GetModel();
|
||||
return (_model is not null && _model.Contains(contains));
|
||||
|
||||
}
|
||||
private void initConfig()
|
||||
{
|
||||
config = new Dictionary<string, object>();
|
||||
@@ -80,6 +108,8 @@ public class AppConfig
|
||||
|
||||
if (device == 1)
|
||||
name = "gpu";
|
||||
else if (device == 2)
|
||||
name = "mid";
|
||||
else
|
||||
name = "cpu";
|
||||
|
||||
273
app/Aura.cs
Normal file
@@ -0,0 +1,273 @@
|
||||
using HidLibrary;
|
||||
using System.Data;
|
||||
using System.Diagnostics;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;
|
||||
using System.Security.Policy;
|
||||
using HidSharp.Utility;
|
||||
|
||||
namespace GHelper
|
||||
{
|
||||
|
||||
[Flags]
|
||||
public enum AuraDev19b6 : uint
|
||||
{
|
||||
BootLogo = 1,
|
||||
BootKeyb = 1 << 1,
|
||||
AwakeLogo = 1 << 2,
|
||||
AwakeKeyb = 1 << 3,
|
||||
SleepLogo = 1 << 4,
|
||||
SleepKeyb = 1 << 5,
|
||||
ShutdownLogo = 1 << 6,
|
||||
ShutdownKeyb = 1 << 7,
|
||||
BootBar = 1u << (7 + 2),
|
||||
AwakeBar = 1u << (7 + 3),
|
||||
SleepBar = 1u << (7 + 4),
|
||||
ShutdownBar = 1u << (7 + 5),
|
||||
BootLid = 1u << (15 + 1),
|
||||
AwakeLid = 1u << (15 + 2),
|
||||
SleepLid = 1u << (15 + 3),
|
||||
ShutdownLid = 1u << (15 + 4)
|
||||
}
|
||||
|
||||
public static class AuraDev19b6Extensions
|
||||
{
|
||||
public static byte[] ToBytes(this AuraDev19b6[] controls)
|
||||
{
|
||||
uint a = 0;
|
||||
foreach (var n in controls)
|
||||
{
|
||||
a |= (uint)n;
|
||||
}
|
||||
return new byte[] { 0x5d, 0xbd, 0x01, (byte)(a & 0xff), (byte)((a & 0xff00) >> 8), (byte)((a & 0xff0000) >> 16) };
|
||||
}
|
||||
|
||||
public static ushort BitOr(this AuraDev19b6 self, AuraDev19b6 rhs)
|
||||
{
|
||||
return (ushort)(self | rhs);
|
||||
}
|
||||
|
||||
public static ushort BitAnd(this AuraDev19b6 self, AuraDev19b6 rhs)
|
||||
{
|
||||
return (ushort)(self & rhs);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Aura
|
||||
{
|
||||
|
||||
static byte[] MESSAGE_SET = { 0x5d, 0xb5, 0, 0, 0 };
|
||||
static byte[] MESSAGE_APPLY = { 0x5d, 0xb4 };
|
||||
|
||||
static int[] deviceIds = { 0x1a30, 0x1854, 0x1869, 0x1866, 0x19b6, 0x1822, 0x1837, 0x1854, 0x184a, 0x183d, 0x8502, 0x1807, 0x17e0 };
|
||||
|
||||
private static int mode = 0;
|
||||
private static int speed = 1;
|
||||
public static Color Color1 = Color.White;
|
||||
public static Color Color2 = Color.Black;
|
||||
|
||||
|
||||
public static Dictionary<int, string> GetSpeeds()
|
||||
{
|
||||
return new Dictionary<int, string>
|
||||
{
|
||||
{ 0, "Slow" },
|
||||
{ 1, "Normal" },
|
||||
{ 2, "Fast" }
|
||||
};
|
||||
}
|
||||
|
||||
static Dictionary<int, string> _modes = new Dictionary<int, string>
|
||||
{
|
||||
{ 0, "Static" },
|
||||
{ 1, "Breathe" },
|
||||
{ 2, "Color Cycle" },
|
||||
{ 3, "Rainbow" },
|
||||
{ 10, "Strobe" },
|
||||
};
|
||||
|
||||
static Dictionary<int, string> _modesStrix = new Dictionary<int, string>
|
||||
{
|
||||
{ 0, "Static" },
|
||||
{ 1, "Breathe" },
|
||||
{ 2, "Color Cycle" },
|
||||
{ 3, "Rainbow" },
|
||||
{ 4, "Star" },
|
||||
{ 5, "Rain" },
|
||||
{ 6, "Highlight" },
|
||||
{ 7, "Laser" },
|
||||
{ 8, "Ripple" },
|
||||
{ 10, "Strobe" },
|
||||
{ 11, "Comet" },
|
||||
{ 12, "Flash" },
|
||||
};
|
||||
|
||||
|
||||
public static Dictionary<int, string> GetModes()
|
||||
{
|
||||
if (Program.config.ContainsModel("TUF"))
|
||||
{
|
||||
_modes.Remove(3);
|
||||
}
|
||||
|
||||
if (Program.config.ContainsModel("401"))
|
||||
{
|
||||
_modes.Remove(2);
|
||||
_modes.Remove(3);
|
||||
}
|
||||
|
||||
if (Program.config.ContainsModel("Strix") || Program.config.ContainsModel("Scar"))
|
||||
{
|
||||
return _modesStrix;
|
||||
}
|
||||
|
||||
return _modes;
|
||||
}
|
||||
|
||||
|
||||
public static int Mode
|
||||
{
|
||||
get { return mode; }
|
||||
set
|
||||
{
|
||||
if (GetModes().ContainsKey(value))
|
||||
mode = value;
|
||||
else
|
||||
mode = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool HasSecondColor()
|
||||
{
|
||||
return (mode == 1 && !Program.config.ContainsModel("TUF"));
|
||||
}
|
||||
|
||||
public static int Speed
|
||||
{
|
||||
get { return speed; }
|
||||
set
|
||||
{
|
||||
if (GetSpeeds().ContainsKey(value))
|
||||
speed = value;
|
||||
else
|
||||
speed = 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void SetColor(int colorCode)
|
||||
{
|
||||
Color1 = Color.FromArgb(colorCode);
|
||||
}
|
||||
|
||||
public static void SetColor2(int colorCode)
|
||||
{
|
||||
Color2 = Color.FromArgb(colorCode);
|
||||
}
|
||||
|
||||
public static byte[] AuraMessage(int mode, Color color, Color color2, int speed)
|
||||
{
|
||||
|
||||
byte[] msg = new byte[17];
|
||||
msg[0] = 0x5d;
|
||||
msg[1] = 0xb3;
|
||||
msg[2] = 0x00; // Zone
|
||||
msg[3] = (byte)mode; // Aura Mode
|
||||
msg[4] = (byte)(color.R); // R
|
||||
msg[5] = (byte)(color.G); // G
|
||||
msg[6] = (byte)(color.B); // B
|
||||
msg[7] = (byte)speed; // aura.speed as u8;
|
||||
msg[8] = 0; // aura.direction as u8;
|
||||
msg[10] = (byte)(color2.R); // R
|
||||
msg[11] = (byte)(color2.G); // G
|
||||
msg[12] = (byte)(color2.B); // B
|
||||
return msg;
|
||||
}
|
||||
|
||||
|
||||
public static void ApplyBrightness(int brightness)
|
||||
{
|
||||
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
|
||||
|
||||
byte[] msg = { 0x5d, 0xba, 0xc5, 0xc4, (byte)brightness };
|
||||
|
||||
foreach (HidDevice device in HidDeviceList)
|
||||
if (device.IsConnected && device.Description.Contains("HID"))
|
||||
{
|
||||
device.OpenDevice();
|
||||
device.Write(msg);
|
||||
device.CloseDevice();
|
||||
}
|
||||
|
||||
Logger.WriteLine("USB-KB = " + BitConverter.ToString(msg));
|
||||
}
|
||||
|
||||
|
||||
public static void ApplyAuraPower(bool awake = true, bool boot = false, bool sleep = false, bool shutdown = false)
|
||||
{
|
||||
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, 0x19b6).ToArray();
|
||||
|
||||
List<AuraDev19b6> flags = new List<AuraDev19b6>();
|
||||
|
||||
if (awake) flags.Add(AuraDev19b6.AwakeKeyb);
|
||||
if (boot) flags.Add(AuraDev19b6.BootKeyb);
|
||||
if (sleep) flags.Add(AuraDev19b6.SleepKeyb);
|
||||
if (shutdown) flags.Add(AuraDev19b6.ShutdownKeyb);
|
||||
|
||||
byte[] msg = AuraDev19b6Extensions.ToBytes(flags.ToArray());
|
||||
|
||||
Debug.WriteLine(BitConverter.ToString(msg));
|
||||
|
||||
foreach (HidDevice device in HidDeviceList)
|
||||
if (device.IsConnected && device.Description.Contains("HID"))
|
||||
{
|
||||
device.OpenDevice();
|
||||
device.Write(msg);
|
||||
device.CloseDevice();
|
||||
}
|
||||
|
||||
Logger.WriteLine("USB-KB = " + BitConverter.ToString(msg));
|
||||
|
||||
if (Program.config.ContainsModel("TUF"))
|
||||
Program.wmi.TUFKeyboardPower(awake, boot, sleep, shutdown);
|
||||
|
||||
}
|
||||
|
||||
public static void ApplyAura()
|
||||
{
|
||||
|
||||
HidDevice[] HidDeviceList = HidDevices.Enumerate(0x0b05, deviceIds).ToArray();
|
||||
|
||||
int _speed;
|
||||
|
||||
switch (Speed)
|
||||
{
|
||||
case 1:
|
||||
_speed = 0xeb;
|
||||
break;
|
||||
case 2:
|
||||
_speed = 0xf5;
|
||||
break;
|
||||
default:
|
||||
_speed = 0xe1;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
byte[] msg = AuraMessage(Mode, Color1, Color2, _speed);
|
||||
foreach (HidDevice device in HidDeviceList)
|
||||
if (device.IsConnected && device.Description.Contains("HID"))
|
||||
{
|
||||
device.OpenDevice();
|
||||
device.Write(msg);
|
||||
device.Write(MESSAGE_SET);
|
||||
device.Write(MESSAGE_APPLY);
|
||||
device.CloseDevice();
|
||||
}
|
||||
|
||||
if (Program.config.ContainsModel("TUF"))
|
||||
Program.wmi.TUFKeyboardRGB(Mode, Color1, _speed);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
// Source thanks to https://github.com/vddCore/Starlight :)
|
||||
|
||||
using Starlight.Communication.Platform;
|
||||
using System.Configuration;
|
||||
|
||||
namespace Starlight.Communication
|
||||
{
|
||||
@@ -8,9 +9,21 @@ namespace Starlight.Communication
|
||||
{
|
||||
private static UsbProvider _usbProvider;
|
||||
|
||||
private static ushort _vendorId;
|
||||
private static ushort _productId;
|
||||
private static int _maxFeatureReportLength;
|
||||
|
||||
protected Device(ushort vendorId, ushort productId, int maxFeatureReportLength)
|
||||
{
|
||||
_usbProvider = new WindowsUsbProvider(vendorId, productId, maxFeatureReportLength);
|
||||
_vendorId = vendorId;
|
||||
_productId = productId;
|
||||
_maxFeatureReportLength = maxFeatureReportLength;
|
||||
SetProvider();
|
||||
}
|
||||
|
||||
public void SetProvider()
|
||||
{
|
||||
_usbProvider = new WindowsUsbProvider(_vendorId, _productId, _maxFeatureReportLength);
|
||||
}
|
||||
|
||||
protected T Packet<T>(params byte[] command) where T : Packet
|
||||
170
app/ControlHelper.cs
Normal file
@@ -0,0 +1,170 @@
|
||||
using CustomControls;
|
||||
using WinFormsSliderBar;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Windows.Forms.DataVisualization.Charting;
|
||||
|
||||
public static class ControlHelper
|
||||
{
|
||||
|
||||
static bool _invert = false;
|
||||
static float _scale = 1;
|
||||
|
||||
public static void Adjust(RForm container, bool invert = false)
|
||||
{
|
||||
|
||||
container.BackColor = RForm.formBack;
|
||||
container.ForeColor = RForm.foreMain;
|
||||
|
||||
_invert = invert;
|
||||
AdjustControls(container.Controls);
|
||||
_invert = false;
|
||||
|
||||
}
|
||||
|
||||
public static void Resize(RForm container, float baseScale = 2)
|
||||
{
|
||||
_scale = GetDpiScale(container).Value / baseScale;
|
||||
if (Math.Abs(_scale - 1) > 0.2) ResizeControls(container.Controls);
|
||||
|
||||
}
|
||||
|
||||
private static void ResizeControls(Control.ControlCollection controls)
|
||||
{
|
||||
foreach (Control control in controls)
|
||||
{
|
||||
var button = control as RButton;
|
||||
if (button != null && button.Image is not null)
|
||||
button.Image = ResizeImage(button.Image);
|
||||
|
||||
/*
|
||||
var pictureBox = control as PictureBox;
|
||||
if (pictureBox != null && pictureBox.BackgroundImage is not null)
|
||||
pictureBox.BackgroundImage = ResizeImage(pictureBox.BackgroundImage);
|
||||
*/
|
||||
|
||||
ResizeControls(control.Controls);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void AdjustControls(Control.ControlCollection controls)
|
||||
{
|
||||
foreach (Control control in controls)
|
||||
{
|
||||
var button = control as RButton;
|
||||
if (button != null)
|
||||
{
|
||||
button.BackColor = button.Secondary ? RForm.buttonSecond : RForm.buttonMain;
|
||||
button.ForeColor = RForm.foreMain;
|
||||
|
||||
button.FlatStyle = FlatStyle.Flat;
|
||||
button.FlatAppearance.BorderColor = RForm.borderMain;
|
||||
|
||||
if (button.Image is not null)
|
||||
button.Image = AdjustImage(button.Image);
|
||||
}
|
||||
|
||||
var pictureBox = control as PictureBox;
|
||||
if (pictureBox != null && pictureBox.BackgroundImage is not null)
|
||||
pictureBox.BackgroundImage = AdjustImage(pictureBox.BackgroundImage);
|
||||
|
||||
|
||||
var combo = control as RComboBox;
|
||||
if (combo != null)
|
||||
{
|
||||
combo.BackColor = RForm.buttonMain;
|
||||
combo.ForeColor = RForm.foreMain;
|
||||
combo.BorderColor = RForm.buttonMain;
|
||||
combo.ButtonColor = RForm.buttonMain;
|
||||
combo.ArrowColor = RForm.foreMain;
|
||||
}
|
||||
|
||||
var gb = control as GroupBox;
|
||||
if (gb != null)
|
||||
{
|
||||
gb.ForeColor = RForm.foreMain;
|
||||
}
|
||||
|
||||
var sl = control as Slider;
|
||||
if (sl != null)
|
||||
{
|
||||
sl.borderColor = RForm.buttonMain;
|
||||
}
|
||||
|
||||
var chk = control as CheckBox;
|
||||
if (chk != null && chk.Padding.Left > 5)
|
||||
{
|
||||
chk.BackColor = RForm.buttonSecond;
|
||||
}
|
||||
|
||||
var chart = control as Chart;
|
||||
if (chart != null)
|
||||
{
|
||||
chart.BackColor = RForm.chartMain;
|
||||
chart.ChartAreas[0].BackColor = RForm.chartMain;
|
||||
|
||||
chart.ChartAreas[0].AxisX.TitleForeColor = RForm.foreMain;
|
||||
chart.ChartAreas[0].AxisY.TitleForeColor = RForm.foreMain;
|
||||
|
||||
chart.ChartAreas[0].AxisX.LabelStyle.ForeColor = RForm.foreMain;
|
||||
chart.ChartAreas[0].AxisY.LabelStyle.ForeColor = RForm.foreMain;
|
||||
|
||||
chart.ChartAreas[0].AxisX.MajorTickMark.LineColor = RForm.foreMain;
|
||||
chart.ChartAreas[0].AxisY.MajorTickMark.LineColor = RForm.foreMain;
|
||||
|
||||
chart.ChartAreas[0].AxisX.MajorGrid.LineColor = RForm.chartGrid;
|
||||
chart.ChartAreas[0].AxisY.MajorGrid.LineColor = RForm.chartGrid;
|
||||
chart.ChartAreas[0].AxisX.LineColor = RForm.chartGrid;
|
||||
chart.ChartAreas[0].AxisY.LineColor = RForm.chartGrid;
|
||||
|
||||
chart.Titles[0].ForeColor = RForm.foreMain;
|
||||
|
||||
}
|
||||
|
||||
AdjustControls(control.Controls);
|
||||
}
|
||||
}
|
||||
|
||||
public static Lazy<float> GetDpiScale(Control control)
|
||||
{
|
||||
return new Lazy<float>(() =>
|
||||
{
|
||||
using (var graphics = control.CreateGraphics())
|
||||
return graphics.DpiX / 96.0f;
|
||||
});
|
||||
}
|
||||
|
||||
private static Image ResizeImage(Image image)
|
||||
{
|
||||
var newSize = new Size((int)(image.Width * _scale), (int)(image.Height * _scale));
|
||||
var pic = new Bitmap(newSize.Width, newSize.Height);
|
||||
|
||||
using (var g = Graphics.FromImage(pic))
|
||||
{
|
||||
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
||||
g.DrawImage(image, new Rectangle(new Point(), newSize));
|
||||
}
|
||||
return pic;
|
||||
}
|
||||
|
||||
private static Image AdjustImage(Image image)
|
||||
{
|
||||
var pic = new Bitmap(image);
|
||||
|
||||
if (_invert)
|
||||
{
|
||||
for (int y = 0; (y <= (pic.Height - 1)); y++)
|
||||
{
|
||||
for (int x = 0; (x <= (pic.Width - 1)); x++)
|
||||
{
|
||||
Color col = pic.GetPixel(x, y);
|
||||
pic.SetPixel(x, y, Color.FromArgb(col.A, (255 - col.R), (255 - col.G), (255 - col.B)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return pic;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
393
app/CustomControls.cs
Normal file
@@ -0,0 +1,393 @@
|
||||
using Microsoft.Win32;
|
||||
using System.ComponentModel;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace CustomControls
|
||||
{
|
||||
|
||||
public class RForm : Form
|
||||
{
|
||||
|
||||
public static Color colorEco = Color.FromArgb(255, 6, 180, 138);
|
||||
public static Color colorStandard = Color.FromArgb(255, 58, 174, 239);
|
||||
public static Color colorTurbo = Color.FromArgb(255, 255, 32, 32);
|
||||
|
||||
public static Color buttonMain;
|
||||
public static Color buttonSecond;
|
||||
|
||||
public static Color formBack;
|
||||
public static Color foreMain;
|
||||
public static Color borderMain;
|
||||
public static Color chartMain;
|
||||
public static Color chartGrid;
|
||||
|
||||
[DllImport("UXTheme.dll", SetLastError = true, EntryPoint = "#138")]
|
||||
public static extern bool CheckSystemDarkModeStatus();
|
||||
|
||||
[DllImport("DwmApi")] //System.Runtime.InteropServices
|
||||
private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize);
|
||||
|
||||
public bool darkTheme = false;
|
||||
|
||||
public static void InitColors(bool darkTheme)
|
||||
{
|
||||
if (darkTheme)
|
||||
{
|
||||
buttonMain = Color.FromArgb(255, 55, 55, 55);
|
||||
buttonSecond = Color.FromArgb(255, 38, 38, 38);
|
||||
|
||||
formBack = Color.FromArgb(255, 28, 28, 28);
|
||||
foreMain = Color.FromArgb(255, 240, 240, 240);
|
||||
borderMain = Color.FromArgb(255, 50, 50, 50);
|
||||
|
||||
chartMain = Color.FromArgb(255, 35, 35, 35);
|
||||
chartGrid = Color.FromArgb(255, 70, 70, 70);
|
||||
}
|
||||
else
|
||||
{
|
||||
buttonMain = SystemColors.ControlLightLight;
|
||||
buttonSecond = SystemColors.ControlLight;
|
||||
|
||||
formBack = SystemColors.Control;
|
||||
foreMain = SystemColors.ControlText;
|
||||
borderMain = Color.LightGray;
|
||||
|
||||
chartMain = SystemColors.ControlLightLight;
|
||||
chartGrid = Color.LightGray;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool IsDarkTheme()
|
||||
{
|
||||
using var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize");
|
||||
var registryValueObject = key?.GetValue("AppsUseLightTheme");
|
||||
|
||||
if (registryValueObject == null) return false;
|
||||
return (int)registryValueObject <= 0;
|
||||
}
|
||||
|
||||
public bool InitTheme(bool setDPI = false)
|
||||
{
|
||||
bool newDarkTheme = CheckSystemDarkModeStatus();
|
||||
bool changed = (darkTheme != newDarkTheme);
|
||||
darkTheme = newDarkTheme;
|
||||
|
||||
InitColors(darkTheme);
|
||||
|
||||
if (setDPI)
|
||||
ControlHelper.Resize(this);
|
||||
|
||||
if (changed)
|
||||
{
|
||||
DwmSetWindowAttribute(this.Handle, 20, new[] { darkTheme ? 1 : 0 }, 4);
|
||||
ControlHelper.Adjust(this, changed);
|
||||
}
|
||||
|
||||
return changed;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class RCheckBox : CheckBox
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class RComboBox : ComboBox
|
||||
{
|
||||
private Color borderColor = Color.Gray;
|
||||
[DefaultValue(typeof(Color), "Gray")]
|
||||
public Color BorderColor
|
||||
{
|
||||
get { return borderColor; }
|
||||
set
|
||||
{
|
||||
if (borderColor != value)
|
||||
{
|
||||
borderColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private Color buttonColor = Color.FromArgb(255, 255, 255, 255);
|
||||
[DefaultValue(typeof(Color), "255, 255, 255")]
|
||||
public Color ButtonColor
|
||||
{
|
||||
get { return buttonColor; }
|
||||
set
|
||||
{
|
||||
if (buttonColor != value)
|
||||
{
|
||||
buttonColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Color arrowColor = Color.Black;
|
||||
[DefaultValue(typeof(Color), "Black")]
|
||||
public Color ArrowColor
|
||||
{
|
||||
get { return arrowColor; }
|
||||
set
|
||||
{
|
||||
if (arrowColor != value)
|
||||
{
|
||||
arrowColor = value;
|
||||
Invalidate();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected override void WndProc(ref Message m)
|
||||
{
|
||||
if (m.Msg == WM_PAINT && DropDownStyle != ComboBoxStyle.Simple)
|
||||
{
|
||||
var clientRect = ClientRectangle;
|
||||
var dropDownButtonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
|
||||
var outerBorder = new Rectangle(clientRect.Location,
|
||||
new Size(clientRect.Width - 1, clientRect.Height - 1));
|
||||
var innerBorder = new Rectangle(outerBorder.X + 1, outerBorder.Y + 1,
|
||||
outerBorder.Width - dropDownButtonWidth - 2, outerBorder.Height - 2);
|
||||
var innerInnerBorder = new Rectangle(innerBorder.X + 1, innerBorder.Y + 1,
|
||||
innerBorder.Width - 2, innerBorder.Height - 2);
|
||||
var dropDownRect = new Rectangle(innerBorder.Right + 1, innerBorder.Y,
|
||||
dropDownButtonWidth, innerBorder.Height + 1);
|
||||
if (RightToLeft == RightToLeft.Yes)
|
||||
{
|
||||
innerBorder.X = clientRect.Width - innerBorder.Right;
|
||||
innerInnerBorder.X = clientRect.Width - innerInnerBorder.Right;
|
||||
dropDownRect.X = clientRect.Width - dropDownRect.Right;
|
||||
dropDownRect.Width += 1;
|
||||
}
|
||||
var innerBorderColor = Enabled ? BackColor : SystemColors.Control;
|
||||
var outerBorderColor = Enabled ? BorderColor : SystemColors.ControlDark;
|
||||
var buttonColor = Enabled ? ButtonColor : SystemColors.Control;
|
||||
var middle = new Point(dropDownRect.Left + dropDownRect.Width / 2,
|
||||
dropDownRect.Top + dropDownRect.Height / 2);
|
||||
var arrow = new Point[]
|
||||
{
|
||||
new Point(middle.X - 3, middle.Y - 2),
|
||||
new Point(middle.X + 4, middle.Y - 2),
|
||||
new Point(middle.X, middle.Y + 2)
|
||||
};
|
||||
var ps = new PAINTSTRUCT();
|
||||
bool shoulEndPaint = false;
|
||||
IntPtr dc;
|
||||
if (m.WParam == IntPtr.Zero)
|
||||
{
|
||||
dc = BeginPaint(Handle, ref ps);
|
||||
m.WParam = dc;
|
||||
shoulEndPaint = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
dc = m.WParam;
|
||||
}
|
||||
var rgn = CreateRectRgn(innerInnerBorder.Left, innerInnerBorder.Top,
|
||||
innerInnerBorder.Right, innerInnerBorder.Bottom);
|
||||
SelectClipRgn(dc, rgn);
|
||||
DefWndProc(ref m);
|
||||
DeleteObject(rgn);
|
||||
rgn = CreateRectRgn(clientRect.Left, clientRect.Top,
|
||||
clientRect.Right, clientRect.Bottom);
|
||||
SelectClipRgn(dc, rgn);
|
||||
using (var g = Graphics.FromHdc(dc))
|
||||
{
|
||||
using (var b = new SolidBrush(buttonColor))
|
||||
{
|
||||
g.FillRectangle(b, dropDownRect);
|
||||
}
|
||||
using (var b = new SolidBrush(arrowColor))
|
||||
{
|
||||
g.FillPolygon(b, arrow);
|
||||
}
|
||||
using (var p = new Pen(innerBorderColor))
|
||||
{
|
||||
g.DrawRectangle(p, innerBorder);
|
||||
g.DrawRectangle(p, innerInnerBorder);
|
||||
}
|
||||
using (var p = new Pen(outerBorderColor))
|
||||
{
|
||||
g.DrawRectangle(p, outerBorder);
|
||||
}
|
||||
}
|
||||
if (shoulEndPaint)
|
||||
EndPaint(Handle, ref ps);
|
||||
DeleteObject(rgn);
|
||||
}
|
||||
else
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
|
||||
private const int WM_PAINT = 0xF;
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct RECT
|
||||
{
|
||||
public int L, T, R, B;
|
||||
}
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct PAINTSTRUCT
|
||||
{
|
||||
public IntPtr hdc;
|
||||
public bool fErase;
|
||||
public int rcPaint_left;
|
||||
public int rcPaint_top;
|
||||
public int rcPaint_right;
|
||||
public int rcPaint_bottom;
|
||||
public bool fRestore;
|
||||
public bool fIncUpdate;
|
||||
public int reserved1;
|
||||
public int reserved2;
|
||||
public int reserved3;
|
||||
public int reserved4;
|
||||
public int reserved5;
|
||||
public int reserved6;
|
||||
public int reserved7;
|
||||
public int reserved8;
|
||||
}
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr BeginPaint(IntPtr hWnd,
|
||||
[In, Out] ref PAINTSTRUCT lpPaint);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool EndPaint(IntPtr hWnd, ref PAINTSTRUCT lpPaint);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
public static extern int SelectClipRgn(IntPtr hDC, IntPtr hRgn);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int GetUpdateRgn(IntPtr hwnd, IntPtr hrgn, bool fErase);
|
||||
public enum RegionFlags
|
||||
{
|
||||
ERROR = 0,
|
||||
NULLREGION = 1,
|
||||
SIMPLEREGION = 2,
|
||||
COMPLEXREGION = 3,
|
||||
}
|
||||
[DllImport("gdi32.dll")]
|
||||
internal static extern bool DeleteObject(IntPtr hObject);
|
||||
|
||||
[DllImport("gdi32.dll")]
|
||||
private static extern IntPtr CreateRectRgn(int x1, int y1, int x2, int y2);
|
||||
}
|
||||
|
||||
public class RButton : Button
|
||||
{
|
||||
//Fields
|
||||
private int borderSize = 5;
|
||||
|
||||
private int borderRadius = 5;
|
||||
public int BorderRadius
|
||||
{
|
||||
get { return borderRadius; }
|
||||
set
|
||||
{
|
||||
borderRadius = value;
|
||||
}
|
||||
}
|
||||
|
||||
private Color borderColor = Color.Transparent;
|
||||
public Color BorderColor
|
||||
{
|
||||
get { return borderColor; }
|
||||
set
|
||||
{
|
||||
borderColor = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private bool activated = false;
|
||||
public bool Activated
|
||||
{
|
||||
get { return activated; }
|
||||
set
|
||||
{
|
||||
if (activated != value)
|
||||
this.Invalidate();
|
||||
activated = value;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
private bool secondary = false;
|
||||
public bool Secondary
|
||||
{
|
||||
get { return secondary; }
|
||||
set
|
||||
{
|
||||
secondary = value;
|
||||
}
|
||||
}
|
||||
|
||||
public RButton()
|
||||
{
|
||||
this.FlatStyle = FlatStyle.Flat;
|
||||
this.FlatAppearance.BorderSize = 0;
|
||||
}
|
||||
|
||||
private GraphicsPath GetFigurePath(Rectangle rect, int radius)
|
||||
{
|
||||
GraphicsPath path = new GraphicsPath();
|
||||
float curveSize = radius * 2F;
|
||||
|
||||
path.StartFigure();
|
||||
path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90);
|
||||
path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90);
|
||||
path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90);
|
||||
path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90);
|
||||
path.CloseFigure();
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
protected override void OnPaint(PaintEventArgs pevent)
|
||||
{
|
||||
|
||||
base.OnPaint(pevent);
|
||||
|
||||
float ratio = pevent.Graphics.DpiX / 192.0f;
|
||||
int border = (int)(ratio * borderSize);
|
||||
|
||||
Rectangle rectSurface = this.ClientRectangle;
|
||||
Rectangle rectBorder = Rectangle.Inflate(rectSurface, -border, -border);
|
||||
|
||||
Color borderDrawColor = activated ? borderColor : Color.Transparent;
|
||||
|
||||
using (GraphicsPath pathSurface = GetFigurePath(rectSurface, borderRadius + border))
|
||||
using (GraphicsPath pathBorder = GetFigurePath(rectBorder, borderRadius))
|
||||
using (Pen penSurface = new Pen(this.Parent.BackColor, border))
|
||||
using (Pen penBorder = new Pen(borderDrawColor, border))
|
||||
{
|
||||
penBorder.Alignment = PenAlignment.Outset;
|
||||
pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
this.Region = new Region(pathSurface);
|
||||
pevent.Graphics.DrawPath(penSurface, pathSurface);
|
||||
pevent.Graphics.DrawPath(penBorder, pathBorder);
|
||||
}
|
||||
|
||||
if (!Enabled && ForeColor != SystemColors.ControlText)
|
||||
{
|
||||
var rect = pevent.ClipRectangle;
|
||||
if (Image is not null)
|
||||
{
|
||||
rect.Y += Image.Height;
|
||||
rect.Height -= Image.Height;
|
||||
}
|
||||
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
|
||||
TextRenderer.DrawText(pevent.Graphics, this.Text, this.Font, rect, Color.Gray, flags);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
120
app/CustomControls.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
||||
484
app/Fans.Designer.cs
generated
Normal file
@@ -0,0 +1,484 @@
|
||||
using CustomControls;
|
||||
using System.Windows.Forms.DataVisualization.Charting;
|
||||
|
||||
namespace GHelper
|
||||
{
|
||||
partial class Fans
|
||||
{
|
||||
/// <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()
|
||||
{
|
||||
ChartArea chartArea4 = new ChartArea();
|
||||
Title title4 = new Title();
|
||||
ChartArea chartArea5 = new ChartArea();
|
||||
Title title5 = new Title();
|
||||
ChartArea chartArea6 = new ChartArea();
|
||||
Title title6 = new Title();
|
||||
panelFans = new Panel();
|
||||
labelTip = new Label();
|
||||
labelBoost = new Label();
|
||||
comboBoost = new RComboBox();
|
||||
picturePerf = new PictureBox();
|
||||
tableFanCharts = new TableLayoutPanel();
|
||||
chartGPU = new Chart();
|
||||
chartCPU = new Chart();
|
||||
chartMid = new Chart();
|
||||
labelFans = new Label();
|
||||
checkApplyFans = new RCheckBox();
|
||||
buttonReset = new RButton();
|
||||
panelPower = new Panel();
|
||||
pictureBox1 = new PictureBox();
|
||||
labelPowerLimits = new Label();
|
||||
checkApplyPower = new RCheckBox();
|
||||
panelCPU = new Panel();
|
||||
labelCPU = new Label();
|
||||
label2 = new Label();
|
||||
trackCPU = new TrackBar();
|
||||
panelTotal = new Panel();
|
||||
labelTotal = new Label();
|
||||
label1 = new Label();
|
||||
trackTotal = new TrackBar();
|
||||
pictureFine = new PictureBox();
|
||||
labelInfo = new Label();
|
||||
panelFans.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)picturePerf).BeginInit();
|
||||
tableFanCharts.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)chartGPU).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartCPU).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartMid).BeginInit();
|
||||
panelPower.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
||||
panelCPU.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackCPU).BeginInit();
|
||||
panelTotal.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackTotal).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)pictureFine).BeginInit();
|
||||
SuspendLayout();
|
||||
//
|
||||
// panelFans
|
||||
//
|
||||
panelFans.Controls.Add(labelTip);
|
||||
panelFans.Controls.Add(labelBoost);
|
||||
panelFans.Controls.Add(comboBoost);
|
||||
panelFans.Controls.Add(picturePerf);
|
||||
panelFans.Controls.Add(tableFanCharts);
|
||||
panelFans.Controls.Add(labelFans);
|
||||
panelFans.Controls.Add(checkApplyFans);
|
||||
panelFans.Controls.Add(buttonReset);
|
||||
panelFans.Dock = DockStyle.Left;
|
||||
panelFans.Location = new Point(364, 0);
|
||||
panelFans.Margin = new Padding(0);
|
||||
panelFans.Name = "panelFans";
|
||||
panelFans.Padding = new Padding(20);
|
||||
panelFans.Size = new Size(824, 1159);
|
||||
panelFans.TabIndex = 12;
|
||||
//
|
||||
// labelTip
|
||||
//
|
||||
labelTip.AutoSize = true;
|
||||
labelTip.BackColor = SystemColors.ControlLightLight;
|
||||
labelTip.Location = new Point(271, 13);
|
||||
labelTip.Name = "labelTip";
|
||||
labelTip.Padding = new Padding(5);
|
||||
labelTip.Size = new Size(107, 42);
|
||||
labelTip.TabIndex = 40;
|
||||
labelTip.Text = "500,300";
|
||||
//
|
||||
// labelBoost
|
||||
//
|
||||
labelBoost.AutoSize = true;
|
||||
labelBoost.Location = new Point(397, 19);
|
||||
labelBoost.Name = "labelBoost";
|
||||
labelBoost.Size = new Size(125, 32);
|
||||
labelBoost.TabIndex = 39;
|
||||
labelBoost.Text = "CPU Boost";
|
||||
//
|
||||
// comboBoost
|
||||
//
|
||||
comboBoost.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
comboBoost.BorderColor = Color.White;
|
||||
comboBoost.ButtonColor = Color.FromArgb(255, 255, 255);
|
||||
comboBoost.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboBoost.FormattingEnabled = true;
|
||||
comboBoost.Items.AddRange(new object[] { "Disabled", "Enabled", "Aggressive", "Efficient Enabled", "Efficient Aggressive" });
|
||||
comboBoost.Location = new Point(526, 15);
|
||||
comboBoost.Name = "comboBoost";
|
||||
comboBoost.Size = new Size(266, 40);
|
||||
comboBoost.TabIndex = 38;
|
||||
//
|
||||
// picturePerf
|
||||
//
|
||||
picturePerf.BackgroundImage = Properties.Resources.icons8_fan_head_96;
|
||||
picturePerf.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
picturePerf.InitialImage = null;
|
||||
picturePerf.Location = new Point(30, 18);
|
||||
picturePerf.Margin = new Padding(4, 2, 4, 2);
|
||||
picturePerf.Name = "picturePerf";
|
||||
picturePerf.Size = new Size(36, 38);
|
||||
picturePerf.TabIndex = 37;
|
||||
picturePerf.TabStop = false;
|
||||
//
|
||||
// tableFanCharts
|
||||
//
|
||||
tableFanCharts.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||
tableFanCharts.ColumnCount = 1;
|
||||
tableFanCharts.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||
tableFanCharts.Controls.Add(chartGPU, 0, 1);
|
||||
tableFanCharts.Controls.Add(chartCPU, 0, 0);
|
||||
tableFanCharts.Controls.Add(chartMid, 0, 2);
|
||||
tableFanCharts.Location = new Point(28, 64);
|
||||
tableFanCharts.Margin = new Padding(6);
|
||||
tableFanCharts.Name = "tableFanCharts";
|
||||
tableFanCharts.RowCount = 2;
|
||||
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
|
||||
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
|
||||
tableFanCharts.RowStyles.Add(new RowStyle(SizeType.Percent, 33F));
|
||||
tableFanCharts.Size = new Size(764, 992);
|
||||
tableFanCharts.TabIndex = 36;
|
||||
//
|
||||
// chartGPU
|
||||
//
|
||||
chartArea4.Name = "ChartArea1";
|
||||
chartGPU.ChartAreas.Add(chartArea4);
|
||||
chartGPU.Dock = DockStyle.Fill;
|
||||
chartGPU.Location = new Point(2, 340);
|
||||
chartGPU.Margin = new Padding(2, 10, 2, 10);
|
||||
chartGPU.Name = "chartGPU";
|
||||
chartGPU.Size = new Size(760, 310);
|
||||
chartGPU.TabIndex = 17;
|
||||
chartGPU.Text = "chartGPU";
|
||||
title4.Name = "Title1";
|
||||
chartGPU.Titles.Add(title4);
|
||||
//
|
||||
// chartCPU
|
||||
//
|
||||
chartArea5.Name = "ChartArea1";
|
||||
chartCPU.ChartAreas.Add(chartArea5);
|
||||
chartCPU.Dock = DockStyle.Fill;
|
||||
chartCPU.Location = new Point(2, 10);
|
||||
chartCPU.Margin = new Padding(2, 10, 2, 10);
|
||||
chartCPU.Name = "chartCPU";
|
||||
chartCPU.Size = new Size(760, 310);
|
||||
chartCPU.TabIndex = 14;
|
||||
chartCPU.Text = "chartCPU";
|
||||
title5.Name = "Title1";
|
||||
chartCPU.Titles.Add(title5);
|
||||
//
|
||||
// chartMid
|
||||
//
|
||||
chartArea6.Name = "ChartArea3";
|
||||
chartMid.ChartAreas.Add(chartArea6);
|
||||
chartMid.Dock = DockStyle.Fill;
|
||||
chartMid.Location = new Point(2, 670);
|
||||
chartMid.Margin = new Padding(2, 10, 2, 10);
|
||||
chartMid.Name = "chartMid";
|
||||
chartMid.Size = new Size(760, 312);
|
||||
chartMid.TabIndex = 14;
|
||||
chartMid.Text = "chartMid";
|
||||
title6.Name = "Title3";
|
||||
chartMid.Titles.Add(title6);
|
||||
chartMid.Visible = false;
|
||||
//
|
||||
// labelFans
|
||||
//
|
||||
labelFans.AutoSize = true;
|
||||
labelFans.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelFans.Location = new Point(66, 20);
|
||||
labelFans.Margin = new Padding(4, 0, 4, 0);
|
||||
labelFans.Name = "labelFans";
|
||||
labelFans.Size = new Size(138, 32);
|
||||
labelFans.TabIndex = 28;
|
||||
labelFans.Text = "Fan Curves";
|
||||
//
|
||||
// checkApplyFans
|
||||
//
|
||||
checkApplyFans.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
|
||||
checkApplyFans.AutoSize = true;
|
||||
checkApplyFans.BackColor = SystemColors.ControlLight;
|
||||
checkApplyFans.Location = new Point(449, 1084);
|
||||
checkApplyFans.Margin = new Padding(4, 2, 4, 2);
|
||||
checkApplyFans.Name = "checkApplyFans";
|
||||
checkApplyFans.Padding = new Padding(15, 5, 15, 5);
|
||||
checkApplyFans.Size = new Size(339, 46);
|
||||
checkApplyFans.TabIndex = 17;
|
||||
checkApplyFans.Text = "Apply Custom Fan Curve";
|
||||
checkApplyFans.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// buttonReset
|
||||
//
|
||||
buttonReset.Activated = false;
|
||||
buttonReset.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
|
||||
buttonReset.BackColor = SystemColors.ControlLight;
|
||||
buttonReset.BorderColor = Color.Transparent;
|
||||
buttonReset.BorderRadius = 2;
|
||||
buttonReset.FlatStyle = FlatStyle.Flat;
|
||||
buttonReset.Location = new Point(30, 1084);
|
||||
buttonReset.Margin = new Padding(4, 2, 4, 2);
|
||||
buttonReset.Name = "buttonReset";
|
||||
buttonReset.Secondary = true;
|
||||
buttonReset.Size = new Size(232, 50);
|
||||
buttonReset.TabIndex = 15;
|
||||
buttonReset.Text = "Factory Defaults";
|
||||
buttonReset.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// panelPower
|
||||
//
|
||||
panelPower.Controls.Add(pictureBox1);
|
||||
panelPower.Controls.Add(labelPowerLimits);
|
||||
panelPower.Controls.Add(checkApplyPower);
|
||||
panelPower.Controls.Add(panelCPU);
|
||||
panelPower.Controls.Add(panelTotal);
|
||||
panelPower.Controls.Add(pictureFine);
|
||||
panelPower.Controls.Add(labelInfo);
|
||||
panelPower.Dock = DockStyle.Left;
|
||||
panelPower.Location = new Point(0, 0);
|
||||
panelPower.Margin = new Padding(10);
|
||||
panelPower.Name = "panelPower";
|
||||
panelPower.Padding = new Padding(10);
|
||||
panelPower.Size = new Size(364, 1159);
|
||||
panelPower.TabIndex = 13;
|
||||
//
|
||||
// pictureBox1
|
||||
//
|
||||
pictureBox1.BackgroundImage = Properties.Resources.icons8_processor_96;
|
||||
pictureBox1.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureBox1.InitialImage = null;
|
||||
pictureBox1.Location = new Point(20, 18);
|
||||
pictureBox1.Margin = new Padding(4, 2, 4, 2);
|
||||
pictureBox1.Name = "pictureBox1";
|
||||
pictureBox1.Size = new Size(36, 38);
|
||||
pictureBox1.TabIndex = 38;
|
||||
pictureBox1.TabStop = false;
|
||||
//
|
||||
// labelPowerLimits
|
||||
//
|
||||
labelPowerLimits.AutoSize = true;
|
||||
labelPowerLimits.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelPowerLimits.Location = new Point(54, 20);
|
||||
labelPowerLimits.Margin = new Padding(4, 0, 4, 0);
|
||||
labelPowerLimits.Name = "labelPowerLimits";
|
||||
labelPowerLimits.Size = new Size(229, 32);
|
||||
labelPowerLimits.TabIndex = 26;
|
||||
labelPowerLimits.Text = "Power Limits (PPT)";
|
||||
//
|
||||
// checkApplyPower
|
||||
//
|
||||
checkApplyPower.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
|
||||
checkApplyPower.AutoSize = true;
|
||||
checkApplyPower.BackColor = SystemColors.ControlLight;
|
||||
checkApplyPower.Location = new Point(20, 1086);
|
||||
checkApplyPower.Margin = new Padding(4, 2, 4, 2);
|
||||
checkApplyPower.Name = "checkApplyPower";
|
||||
checkApplyPower.Padding = new Padding(15, 5, 15, 5);
|
||||
checkApplyPower.Size = new Size(277, 46);
|
||||
checkApplyPower.TabIndex = 25;
|
||||
checkApplyPower.Text = "Apply Power Limits";
|
||||
checkApplyPower.UseVisualStyleBackColor = false;
|
||||
//
|
||||
// panelCPU
|
||||
//
|
||||
panelCPU.Controls.Add(labelCPU);
|
||||
panelCPU.Controls.Add(label2);
|
||||
panelCPU.Controls.Add(trackCPU);
|
||||
panelCPU.Location = new Point(184, 72);
|
||||
panelCPU.Margin = new Padding(4);
|
||||
panelCPU.Name = "panelCPU";
|
||||
panelCPU.Size = new Size(160, 510);
|
||||
panelCPU.TabIndex = 23;
|
||||
//
|
||||
// labelCPU
|
||||
//
|
||||
labelCPU.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelCPU.Location = new Point(13, 40);
|
||||
labelCPU.Margin = new Padding(4, 0, 4, 0);
|
||||
labelCPU.Name = "labelCPU";
|
||||
labelCPU.Size = new Size(120, 32);
|
||||
labelCPU.TabIndex = 13;
|
||||
labelCPU.Text = "CPU";
|
||||
labelCPU.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label2
|
||||
//
|
||||
label2.AutoSize = true;
|
||||
label2.Location = new Point(44, 8);
|
||||
label2.Margin = new Padding(4, 0, 4, 0);
|
||||
label2.Name = "label2";
|
||||
label2.Size = new Size(58, 32);
|
||||
label2.TabIndex = 12;
|
||||
label2.Text = "CPU";
|
||||
label2.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// trackCPU
|
||||
//
|
||||
trackCPU.Location = new Point(48, 88);
|
||||
trackCPU.Margin = new Padding(4, 2, 4, 2);
|
||||
trackCPU.Maximum = 85;
|
||||
trackCPU.Minimum = 5;
|
||||
trackCPU.Name = "trackCPU";
|
||||
trackCPU.Orientation = Orientation.Vertical;
|
||||
trackCPU.Size = new Size(90, 416);
|
||||
trackCPU.TabIndex = 11;
|
||||
trackCPU.TickFrequency = 5;
|
||||
trackCPU.Value = 80;
|
||||
//
|
||||
// panelTotal
|
||||
//
|
||||
panelTotal.Controls.Add(labelTotal);
|
||||
panelTotal.Controls.Add(label1);
|
||||
panelTotal.Controls.Add(trackTotal);
|
||||
panelTotal.Location = new Point(16, 72);
|
||||
panelTotal.Margin = new Padding(4);
|
||||
panelTotal.Name = "panelTotal";
|
||||
panelTotal.Size = new Size(160, 512);
|
||||
panelTotal.TabIndex = 22;
|
||||
//
|
||||
// labelTotal
|
||||
//
|
||||
labelTotal.Font = new Font("Segoe UI", 9F, FontStyle.Bold, GraphicsUnit.Point);
|
||||
labelTotal.Location = new Point(16, 40);
|
||||
labelTotal.Margin = new Padding(4, 0, 4, 0);
|
||||
labelTotal.Name = "labelTotal";
|
||||
labelTotal.Size = new Size(122, 32);
|
||||
labelTotal.TabIndex = 12;
|
||||
labelTotal.Text = "Platform";
|
||||
labelTotal.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// label1
|
||||
//
|
||||
label1.AutoSize = true;
|
||||
label1.Location = new Point(26, 8);
|
||||
label1.Margin = new Padding(4, 0, 4, 0);
|
||||
label1.Name = "label1";
|
||||
label1.Size = new Size(104, 32);
|
||||
label1.TabIndex = 11;
|
||||
label1.Text = "Platform";
|
||||
label1.TextAlign = ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// trackTotal
|
||||
//
|
||||
trackTotal.Location = new Point(44, 88);
|
||||
trackTotal.Margin = new Padding(4, 2, 4, 2);
|
||||
trackTotal.Maximum = 180;
|
||||
trackTotal.Minimum = 10;
|
||||
trackTotal.Name = "trackTotal";
|
||||
trackTotal.Orientation = Orientation.Vertical;
|
||||
trackTotal.Size = new Size(90, 416);
|
||||
trackTotal.TabIndex = 10;
|
||||
trackTotal.TickFrequency = 5;
|
||||
trackTotal.TickStyle = TickStyle.TopLeft;
|
||||
trackTotal.Value = 125;
|
||||
//
|
||||
// pictureFine
|
||||
//
|
||||
pictureFine.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||
pictureFine.BackgroundImageLayout = ImageLayout.Zoom;
|
||||
pictureFine.Image = Properties.Resources.everything_is_fine_itsfine;
|
||||
pictureFine.Location = new Point(20, 682);
|
||||
pictureFine.Margin = new Padding(4, 2, 4, 2);
|
||||
pictureFine.Name = "pictureFine";
|
||||
pictureFine.Size = new Size(324, 268);
|
||||
pictureFine.SizeMode = PictureBoxSizeMode.Zoom;
|
||||
pictureFine.TabIndex = 20;
|
||||
pictureFine.TabStop = false;
|
||||
pictureFine.Visible = false;
|
||||
//
|
||||
// labelInfo
|
||||
//
|
||||
labelInfo.Location = new Point(24, 618);
|
||||
labelInfo.Margin = new Padding(4, 0, 4, 0);
|
||||
labelInfo.Name = "labelInfo";
|
||||
labelInfo.Size = new Size(320, 330);
|
||||
labelInfo.TabIndex = 19;
|
||||
labelInfo.Text = "label";
|
||||
//
|
||||
// Fans
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(192F, 192F);
|
||||
AutoScaleMode = AutoScaleMode.Dpi;
|
||||
AutoSize = true;
|
||||
AutoSizeMode = AutoSizeMode.GrowAndShrink;
|
||||
ClientSize = new Size(1178, 1159);
|
||||
Controls.Add(panelFans);
|
||||
Controls.Add(panelPower);
|
||||
Margin = new Padding(4, 2, 4, 2);
|
||||
MaximizeBox = false;
|
||||
MdiChildrenMinimizedAnchorBottom = false;
|
||||
MinimizeBox = false;
|
||||
MinimumSize = new Size(26, 1230);
|
||||
Name = "Fans";
|
||||
ShowIcon = false;
|
||||
ShowInTaskbar = false;
|
||||
StartPosition = FormStartPosition.CenterScreen;
|
||||
Text = "Fans and Power";
|
||||
panelFans.ResumeLayout(false);
|
||||
panelFans.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)picturePerf).EndInit();
|
||||
tableFanCharts.ResumeLayout(false);
|
||||
((System.ComponentModel.ISupportInitialize)chartGPU).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartCPU).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)chartMid).EndInit();
|
||||
panelPower.ResumeLayout(false);
|
||||
panelPower.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
|
||||
panelCPU.ResumeLayout(false);
|
||||
panelCPU.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackCPU).EndInit();
|
||||
panelTotal.ResumeLayout(false);
|
||||
panelTotal.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)trackTotal).EndInit();
|
||||
((System.ComponentModel.ISupportInitialize)pictureFine).EndInit();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
private Panel panelFans;
|
||||
private RCheckBox checkApplyFans;
|
||||
private RButton buttonReset;
|
||||
private Panel panelPower;
|
||||
private RCheckBox checkApplyPower;
|
||||
private Panel panelCPU;
|
||||
private Label labelCPU;
|
||||
private Label label2;
|
||||
private TrackBar trackCPU;
|
||||
private Panel panelTotal;
|
||||
private Label labelTotal;
|
||||
private Label label1;
|
||||
private TrackBar trackTotal;
|
||||
private PictureBox pictureFine;
|
||||
private Label labelInfo;
|
||||
private Label labelPowerLimits;
|
||||
private TableLayoutPanel tableFanCharts;
|
||||
private System.Windows.Forms.DataVisualization.Charting.Chart chartGPU;
|
||||
private System.Windows.Forms.DataVisualization.Charting.Chart chartCPU;
|
||||
private System.Windows.Forms.DataVisualization.Charting.Chart chartMid;
|
||||
private Label labelFans;
|
||||
private PictureBox picturePerf;
|
||||
private PictureBox pictureBox1;
|
||||
private RComboBox comboBoost;
|
||||
private Label labelBoost;
|
||||
private Label labelTip;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +1,87 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms.DataVisualization.Charting;
|
||||
using CustomControls;
|
||||
|
||||
namespace GHelper
|
||||
{
|
||||
public partial class Fans : Form
|
||||
public partial class Fans : RForm
|
||||
{
|
||||
|
||||
DataPoint curPoint = null;
|
||||
Series seriesCPU;
|
||||
Series seriesGPU;
|
||||
Series seriesMid;
|
||||
|
||||
const int MaxTotal = 150;
|
||||
const int MinTotal = 15;
|
||||
const int DefaultTotal = 125;
|
||||
static int MinRPM, MaxRPM;
|
||||
public Fans()
|
||||
{
|
||||
|
||||
const int MaxCPU = 90;
|
||||
const int MinCPU = 15;
|
||||
const int DefaultCPU = 80;
|
||||
InitializeComponent();
|
||||
InitTheme();
|
||||
|
||||
MinRPM = 18;
|
||||
MaxRPM = HardwareMonitor.GetFanMax();
|
||||
|
||||
|
||||
|
||||
labelTip.Visible = false;
|
||||
labelTip.BackColor = Color.Transparent;
|
||||
|
||||
FormClosing += Fans_FormClosing;
|
||||
|
||||
seriesCPU = chartCPU.Series.Add("CPU");
|
||||
seriesGPU = chartGPU.Series.Add("GPU");
|
||||
seriesMid = chartMid.Series.Add("Mid");
|
||||
|
||||
seriesCPU.Color = colorStandard;
|
||||
seriesGPU.Color = colorTurbo;
|
||||
seriesMid.Color = colorEco;
|
||||
|
||||
chartCPU.MouseMove += ChartCPU_MouseMove;
|
||||
chartCPU.MouseUp += ChartCPU_MouseUp;
|
||||
|
||||
chartGPU.MouseMove += ChartCPU_MouseMove;
|
||||
chartGPU.MouseUp += ChartCPU_MouseUp;
|
||||
|
||||
chartMid.MouseMove += ChartCPU_MouseMove;
|
||||
chartMid.MouseUp += ChartCPU_MouseUp;
|
||||
|
||||
buttonReset.Click += ButtonReset_Click;
|
||||
|
||||
trackTotal.Maximum = ASUSWmi.MaxTotal;
|
||||
trackTotal.Minimum = ASUSWmi.MinTotal;
|
||||
|
||||
trackCPU.Maximum = ASUSWmi.MaxCPU;
|
||||
trackCPU.Minimum = ASUSWmi.MinCPU;
|
||||
|
||||
trackCPU.Scroll += TrackPower_Scroll;
|
||||
trackTotal.Scroll += TrackPower_Scroll;
|
||||
|
||||
trackCPU.MouseUp += TrackPower_MouseUp;
|
||||
trackTotal.MouseUp += TrackPower_MouseUp;
|
||||
|
||||
checkApplyFans.Click += CheckApplyFans_Click;
|
||||
checkApplyPower.Click += CheckApplyPower_Click;
|
||||
|
||||
//labelInfo.MaximumSize = new Size(280, 0);
|
||||
labelInfo.Text = "Power Limits (PPT) is\nexperimental feature.\n\nUse carefully and\non your own risk!";
|
||||
|
||||
InitFans();
|
||||
InitPower();
|
||||
InitBoost();
|
||||
|
||||
comboBoost.SelectedValueChanged += ComboBoost_Changed;
|
||||
|
||||
Shown += Fans_Shown;
|
||||
|
||||
}
|
||||
|
||||
static string ChartPercToRPM(int percentage, string unit = "")
|
||||
{
|
||||
if (percentage == 0) return "OFF";
|
||||
|
||||
return (200 * Math.Round((float)(MinRPM * 100 + (MaxRPM - MinRPM) * percentage) / 200)).ToString() + unit;
|
||||
}
|
||||
|
||||
void SetChart(Chart chart, int device)
|
||||
{
|
||||
@@ -26,19 +90,15 @@ namespace GHelper
|
||||
|
||||
if (device == 1)
|
||||
title = "GPU Fan Profile";
|
||||
else if (device == 2)
|
||||
title = "Middle Fan Profile";
|
||||
else
|
||||
title = "CPU Fan Profile";
|
||||
|
||||
if (Program.settingsForm.perfName.Length > 0)
|
||||
title += ": " + Program.settingsForm.perfName;
|
||||
labelFans.Text = "Fan Profiles: " + Program.settingsForm.perfName;
|
||||
|
||||
if (chart.Titles.Count > 0)
|
||||
chart.Titles[0].Text = title;
|
||||
else
|
||||
chart.Titles.Add(title);
|
||||
|
||||
chart.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.LightGray;
|
||||
chart.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.LightGray;
|
||||
chart.Titles[0].Text = title;
|
||||
|
||||
chart.ChartAreas[0].AxisX.Minimum = 10;
|
||||
chart.ChartAreas[0].AxisX.Maximum = 100;
|
||||
@@ -49,10 +109,13 @@ namespace GHelper
|
||||
|
||||
chart.ChartAreas[0].AxisY.LabelStyle.Font = new Font("Arial", 7F);
|
||||
|
||||
chart.ChartAreas[0].AxisY.CustomLabels.Add(-2, 2, "OFF");
|
||||
chart.ChartAreas[0].AxisX.MajorGrid.LineColor = chartGrid;
|
||||
chart.ChartAreas[0].AxisY.MajorGrid.LineColor = chartGrid;
|
||||
chart.ChartAreas[0].AxisX.LineColor = chartGrid;
|
||||
chart.ChartAreas[0].AxisY.LineColor = chartGrid;
|
||||
|
||||
for (int i = 1; i <= 9; i++)
|
||||
chart.ChartAreas[0].AxisY.CustomLabels.Add(i * 10 - 2, i * 10 + 2, (1800 + 400 * i).ToString());
|
||||
for (int i = 0; i <= 90; i += 10)
|
||||
chart.ChartAreas[0].AxisY.CustomLabels.Add(i - 2, i + 2, ChartPercToRPM(i));
|
||||
|
||||
chart.ChartAreas[0].AxisY.CustomLabels.Add(98, 102, "RPM");
|
||||
|
||||
@@ -65,54 +128,42 @@ namespace GHelper
|
||||
|
||||
private void Fans_Shown(object? sender, EventArgs e)
|
||||
{
|
||||
Top = Program.settingsForm.Top;
|
||||
if (Height > Program.settingsForm.Height)
|
||||
{
|
||||
Top = Program.settingsForm.Top + Program.settingsForm.Height - Height;
|
||||
}
|
||||
else
|
||||
{
|
||||
MinimumSize = new Size(0, Program.settingsForm.Height);
|
||||
Height = Program.settingsForm.Height;
|
||||
Top = Program.settingsForm.Top;
|
||||
}
|
||||
|
||||
|
||||
Left = Program.settingsForm.Left - Width - 5;
|
||||
}
|
||||
|
||||
public Fans()
|
||||
|
||||
private void TrackPower_MouseUp(object? sender, MouseEventArgs e)
|
||||
{
|
||||
Program.settingsForm.AutoPower();
|
||||
}
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
FormClosing += Fans_FormClosing;
|
||||
|
||||
seriesCPU = chartCPU.Series.Add("CPU");
|
||||
seriesGPU = chartGPU.Series.Add("GPU");
|
||||
|
||||
seriesCPU.Color = Color.Blue;
|
||||
seriesGPU.Color = Color.Red;
|
||||
|
||||
chartCPU.MouseMove += ChartCPU_MouseMove;
|
||||
chartCPU.MouseUp += ChartCPU_MouseUp;
|
||||
|
||||
chartGPU.MouseMove += ChartCPU_MouseMove;
|
||||
chartGPU.MouseUp += ChartCPU_MouseUp;
|
||||
|
||||
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;
|
||||
checkApplyPower.Click += CheckApplyPower_Click;
|
||||
|
||||
//labelInfo.MaximumSize = new Size(280, 0);
|
||||
labelInfo.Text = "Power Limits (PPT) is\nexperimental feature.\n\nUse carefully and\non your own risk!";
|
||||
|
||||
InitFans();
|
||||
InitPower();
|
||||
|
||||
Shown += Fans_Shown;
|
||||
public void InitBoost()
|
||||
{
|
||||
int boost = NativeMethods.GetCPUBoost();
|
||||
if (boost >= 0)
|
||||
comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1);
|
||||
}
|
||||
|
||||
private void ComboBoost_Changed(object? sender, EventArgs e)
|
||||
{
|
||||
if (Program.config.getConfigPerf("auto_boost") != comboBoost.SelectedIndex)
|
||||
{
|
||||
NativeMethods.SetCPUBoost(comboBoost.SelectedIndex);
|
||||
Program.config.setConfigPerf("auto_boost", comboBoost.SelectedIndex);
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckApplyPower_Click(object? sender, EventArgs e)
|
||||
@@ -120,13 +171,38 @@ namespace GHelper
|
||||
if (sender is null) return;
|
||||
CheckBox chk = (CheckBox)sender;
|
||||
Program.config.setConfigPerf("auto_apply_power", chk.Checked ? 1 : 0);
|
||||
|
||||
if (chk.Checked)
|
||||
{
|
||||
Program.settingsForm.AutoPower();
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
|
||||
Program.settingsForm.AutoFans();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void CheckAuto_Click(object? sender, EventArgs e)
|
||||
private void CheckApplyFans_Click(object? sender, EventArgs e)
|
||||
{
|
||||
if (sender is null) return;
|
||||
CheckBox chk = (CheckBox)sender;
|
||||
|
||||
Program.config.setConfigPerf("auto_apply", chk.Checked ? 1 : 0);
|
||||
|
||||
if (chk.Checked)
|
||||
{
|
||||
Program.settingsForm.AutoFans();
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
|
||||
Program.settingsForm.AutoPower();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void Fans_FormClosing(object? sender, FormClosingEventArgs e)
|
||||
@@ -138,17 +214,21 @@ namespace GHelper
|
||||
}
|
||||
}
|
||||
|
||||
private void ButtonApplyPower_Click(object? sender, EventArgs e)
|
||||
{
|
||||
Program.settingsForm.SetPower();
|
||||
ApplyLabel(true);
|
||||
}
|
||||
|
||||
public void InitPower(bool changed = false)
|
||||
{
|
||||
|
||||
panelPower.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0);
|
||||
panelCPU.Visible = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0);
|
||||
bool cpuBmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_CPUB0) >= 0); // 2022 model +
|
||||
bool cpuAmode = (Program.wmi.DeviceGet(ASUSWmi.PPT_TotalA0) >= 0); // 2021 model +
|
||||
|
||||
panelPower.Visible = cpuAmode;
|
||||
panelCPU.Visible = cpuBmode;
|
||||
|
||||
// Yes, that's stupid, but Total slider on 2021 model actually adjusts CPU PPT
|
||||
if (!cpuBmode)
|
||||
{
|
||||
label1.Text = "CPU SPPT";
|
||||
}
|
||||
|
||||
int limit_total;
|
||||
int limit_cpu;
|
||||
@@ -158,22 +238,20 @@ namespace GHelper
|
||||
{
|
||||
limit_total = trackTotal.Value;
|
||||
limit_cpu = trackCPU.Value;
|
||||
ApplyLabel(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
limit_total = Program.config.getConfigPerf("limit_total");
|
||||
limit_cpu = Program.config.getConfigPerf("limit_cpu");
|
||||
ApplyLabel(apply);
|
||||
}
|
||||
|
||||
if (limit_total < 0) limit_total = DefaultTotal;
|
||||
if (limit_total > MaxTotal) limit_total = MaxTotal;
|
||||
if (limit_total < MinTotal) limit_total = MinTotal;
|
||||
if (limit_total < 0) limit_total = ASUSWmi.DefaultTotal;
|
||||
if (limit_total > ASUSWmi.MaxTotal) limit_total = ASUSWmi.MaxTotal;
|
||||
if (limit_total < ASUSWmi.MinTotal) limit_total = ASUSWmi.MinTotal;
|
||||
|
||||
if (limit_cpu < 0) limit_cpu = DefaultCPU;
|
||||
if (limit_cpu > MaxCPU) limit_cpu = MaxCPU;
|
||||
if (limit_cpu < MinCPU) limit_cpu = MinCPU;
|
||||
if (limit_cpu < 0) limit_cpu = ASUSWmi.DefaultCPU;
|
||||
if (limit_cpu > ASUSWmi.MaxCPU) limit_cpu = ASUSWmi.MaxCPU;
|
||||
if (limit_cpu < ASUSWmi.MinCPU) limit_cpu = ASUSWmi.MinCPU;
|
||||
if (limit_cpu > limit_total) limit_cpu = limit_total;
|
||||
|
||||
trackTotal.Value = limit_total;
|
||||
@@ -186,38 +264,36 @@ namespace GHelper
|
||||
|
||||
Program.config.setConfigPerf("limit_total", limit_total);
|
||||
Program.config.setConfigPerf("limit_cpu", limit_cpu);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void TrackTotal_Scroll(object? sender, EventArgs e)
|
||||
private void TrackPower_Scroll(object? sender, EventArgs e)
|
||||
{
|
||||
InitPower(true);
|
||||
}
|
||||
|
||||
private void TrackCPU_Scroll(object? sender, EventArgs e)
|
||||
{
|
||||
InitPower(true);
|
||||
}
|
||||
|
||||
|
||||
public void ApplyLabel(bool applied = false)
|
||||
{
|
||||
if (applied)
|
||||
{
|
||||
labelApplied.ForeColor = Color.Blue;
|
||||
labelApplied.Text = "Applied";
|
||||
}
|
||||
else
|
||||
{
|
||||
labelApplied.ForeColor = Color.Red;
|
||||
labelApplied.Text = "Not Applied";
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public void InitFans()
|
||||
{
|
||||
|
||||
byte[] curve = Program.wmi.GetFanCurve(2);
|
||||
|
||||
if (curve.All(singleByte => singleByte == 0))
|
||||
{
|
||||
Program.config.setConfig("mid_fan", 0);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.config.setConfig("mid_fan", 1);
|
||||
chartMid.Visible = true;
|
||||
SetChart(chartMid, 2);
|
||||
LoadProfile(seriesMid, 2);
|
||||
}
|
||||
|
||||
|
||||
SetChart(chartCPU, 0);
|
||||
SetChart(chartGPU, 1);
|
||||
|
||||
@@ -226,7 +302,7 @@ namespace GHelper
|
||||
|
||||
int auto_apply = Program.config.getConfigPerf("auto_apply");
|
||||
|
||||
checkAuto.Checked = (auto_apply == 1);
|
||||
checkApplyFans.Checked = (auto_apply == 1);
|
||||
|
||||
}
|
||||
|
||||
@@ -261,7 +337,7 @@ namespace GHelper
|
||||
|
||||
}
|
||||
|
||||
void ApplyProfile(Series series, int device)
|
||||
void SaveProfile(Series series, int device)
|
||||
{
|
||||
byte[] curve = new byte[16];
|
||||
int i = 0;
|
||||
@@ -273,37 +349,41 @@ namespace GHelper
|
||||
}
|
||||
|
||||
Program.config.setFanConfig(device, curve);
|
||||
Program.wmi.SetFanCurve(device, curve);
|
||||
//Program.wmi.SetFanCurve(device, curve);
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void ButtonApply_Click(object? sender, EventArgs e)
|
||||
{
|
||||
ApplyProfile(seriesCPU, 0);
|
||||
ApplyProfile(seriesGPU, 1);
|
||||
}
|
||||
|
||||
private void ButtonReset_Click(object? sender, EventArgs e)
|
||||
{
|
||||
|
||||
LoadProfile(seriesCPU, 0, 1);
|
||||
LoadProfile(seriesGPU, 1, 1);
|
||||
if (Program.config.getConfig("mid_fan") == 1)
|
||||
LoadProfile(seriesMid, 2, 1);
|
||||
|
||||
checkAuto.Checked = false;
|
||||
checkApplyFans.Checked = false;
|
||||
checkApplyPower.Checked = false;
|
||||
|
||||
Program.config.setConfigPerf("auto_apply", 0);
|
||||
Program.config.setConfigPerf("auto_apply_power", 0);
|
||||
|
||||
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"));
|
||||
|
||||
ApplyLabel(false);
|
||||
Program.wmi.DeviceSet(ASUSWmi.PerformanceMode, Program.config.getConfig("performance_mode"), "PerfMode");
|
||||
}
|
||||
|
||||
private void ChartCPU_MouseUp(object? sender, MouseEventArgs e)
|
||||
{
|
||||
curPoint = null;
|
||||
labelTip.Visible = false;
|
||||
|
||||
SaveProfile(seriesCPU, 0);
|
||||
SaveProfile(seriesGPU, 1);
|
||||
if (Program.config.getConfig("mid_fan") == 1)
|
||||
SaveProfile(seriesMid, 2);
|
||||
|
||||
Program.settingsForm.AutoFans();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void ChartCPU_MouseMove(object? sender, MouseEventArgs e)
|
||||
@@ -341,13 +421,18 @@ namespace GHelper
|
||||
if (dy < 0) dy = 0;
|
||||
if (dy > 100) dy = 100;
|
||||
|
||||
dymin = (dx - 60) * 1.2;
|
||||
dymin = (dx - 65) * 1.2;
|
||||
|
||||
if (dy < dymin) dy = dymin;
|
||||
|
||||
curPoint.XValue = dx;
|
||||
curPoint.YValues[0] = dy;
|
||||
|
||||
labelTip.Visible = true;
|
||||
labelTip.Text = Math.Round(dx) + "C, " + ChartPercToRPM((int)dy, " RPM");
|
||||
labelTip.Top = e.Y + ((Control)sender).Top;
|
||||
labelTip.Left = e.X;
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -15,10 +15,32 @@
|
||||
<AssemblyName>GHelper</AssemblyName>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
||||
<AssemblyVersion>0.18</AssemblyVersion>
|
||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||
<AssemblyVersion>0.49</AssemblyVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="screenshots\**" />
|
||||
<EmbeddedResource Remove="screenshots\**" />
|
||||
<None Remove="screenshots\**" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Resources\eco.ico" />
|
||||
<None Remove="Resources\icons8-charging-battery-48.png" />
|
||||
@@ -32,25 +54,17 @@
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="favicon.ico">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="hidlibrary" Version="3.3.40" />
|
||||
<PackageReference Include="HidSharpCore" Version="1.2.1.1" />
|
||||
<PackageReference Include="NvAPIWrapper.Net" Version="0.8.1.101" />
|
||||
<PackageReference Include="System.Management" Version="7.0.0" />
|
||||
<PackageReference Include="TaskScheduler" Version="2.10.1" />
|
||||
<PackageReference Include="WinForms.DataVisualization" Version="1.7.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Management.Infrastructure">
|
||||
<HintPath>..\..\.nuget\packages\microsoft.management.infrastructure\2.0.0\ref\net451\Microsoft.Management.Infrastructure.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Management.Infrastructure.Native">
|
||||
<HintPath>..\..\.nuget\packages\microsoft.management.infrastructure.runtime.win\2.0.0\runtimes\win10-x64\lib\netstandard1.6\Microsoft.Management.Infrastructure.Native.dll</HintPath>
|
||||
</Reference>
|
||||
<PackageReference Include="WinForms.DataVisualization" Version="1.8.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -101,8 +115,4 @@
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="screenshots\" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
485
app/Gpu/AmdAdl2.cs
Normal file
@@ -0,0 +1,485 @@
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace AmdAdl2;
|
||||
|
||||
#region Export Struct
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLSingleSensorData {
|
||||
public int Supported;
|
||||
public int Value;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLPMLogDataOutput {
|
||||
int Size;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Adl2.ADL_PMLOG_MAX_SENSORS)]
|
||||
public ADLSingleSensorData[] Sensors;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLGcnInfo
|
||||
{
|
||||
public int CuCount; //Number of compute units on the ASIC.
|
||||
public int TexCount; //Number of texture mapping units.
|
||||
public int RopCount; //Number of Render backend Units.
|
||||
public int ASICFamilyId; //Such SI, VI. See /inc/asic_reg/atiid.h for family ids
|
||||
public int ASICRevisionId; //Such as Ellesmere, Fiji. For example - VI family revision ids are stored in /inc/asic_reg/vi_id.h
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum ADLAsicFamilyType {
|
||||
Undefined = 0,
|
||||
Discrete = 1 << 0,
|
||||
Integrated = 1 << 1,
|
||||
Workstation = 1 << 2,
|
||||
FireMV = 1 << 3,
|
||||
Xgp = 1 << 4,
|
||||
Fusion = 1 << 5,
|
||||
Firestream = 1 << 6,
|
||||
Embedded = 1 << 7,
|
||||
}
|
||||
|
||||
public enum ADLSensorType {
|
||||
SENSOR_MAXTYPES = 0,
|
||||
PMLOG_CLK_GFXCLK = 1, // Current graphic clock value in MHz
|
||||
PMLOG_CLK_MEMCLK = 2, // Current memory clock value in MHz
|
||||
PMLOG_CLK_SOCCLK = 3,
|
||||
PMLOG_CLK_UVDCLK1 = 4,
|
||||
PMLOG_CLK_UVDCLK2 = 5,
|
||||
PMLOG_CLK_VCECLK = 6,
|
||||
PMLOG_CLK_VCNCLK = 7,
|
||||
PMLOG_TEMPERATURE_EDGE = 8, // Current edge of the die temperature value in C
|
||||
PMLOG_TEMPERATURE_MEM = 9,
|
||||
PMLOG_TEMPERATURE_VRVDDC = 10,
|
||||
PMLOG_TEMPERATURE_VRMVDD = 11,
|
||||
PMLOG_TEMPERATURE_LIQUID = 12,
|
||||
PMLOG_TEMPERATURE_PLX = 13,
|
||||
PMLOG_FAN_RPM = 14, // Current fan RPM value
|
||||
PMLOG_FAN_PERCENTAGE = 15, // Current ratio of fan RPM and max RPM
|
||||
PMLOG_SOC_VOLTAGE = 16,
|
||||
PMLOG_SOC_POWER = 17,
|
||||
PMLOG_SOC_CURRENT = 18,
|
||||
PMLOG_INFO_ACTIVITY_GFX = 19, // Current graphic activity level in percentage
|
||||
PMLOG_INFO_ACTIVITY_MEM = 20, // Current memory activity level in percentage
|
||||
PMLOG_GFX_VOLTAGE = 21, // Current graphic voltage in mV
|
||||
PMLOG_MEM_VOLTAGE = 22,
|
||||
PMLOG_ASIC_POWER = 23, // Current ASIC power draw in Watt
|
||||
PMLOG_TEMPERATURE_VRSOC = 24,
|
||||
PMLOG_TEMPERATURE_VRMVDD0 = 25,
|
||||
PMLOG_TEMPERATURE_VRMVDD1 = 26,
|
||||
PMLOG_TEMPERATURE_HOTSPOT = 27, // Current center of the die temperature value in C
|
||||
PMLOG_TEMPERATURE_GFX = 28,
|
||||
PMLOG_TEMPERATURE_SOC = 29,
|
||||
PMLOG_GFX_POWER = 30,
|
||||
PMLOG_GFX_CURRENT = 31,
|
||||
PMLOG_TEMPERATURE_CPU = 32,
|
||||
PMLOG_CPU_POWER = 33,
|
||||
PMLOG_CLK_CPUCLK = 34,
|
||||
PMLOG_THROTTLER_STATUS = 35, // A bit map of GPU throttle information. If a bit is set, the bit represented type of thorttling occurred in the last metrics sampling period
|
||||
PMLOG_CLK_VCN1CLK1 = 36,
|
||||
PMLOG_CLK_VCN1CLK2 = 37,
|
||||
PMLOG_SMART_POWERSHIFT_CPU = 38,
|
||||
PMLOG_SMART_POWERSHIFT_DGPU = 39,
|
||||
PMLOG_BUS_SPEED = 40, // Current PCIE bus speed running
|
||||
PMLOG_BUS_LANES = 41, // Current PCIE bus lanes using
|
||||
PMLOG_TEMPERATURE_LIQUID0 = 42,
|
||||
PMLOG_TEMPERATURE_LIQUID1 = 43,
|
||||
PMLOG_CLK_FCLK = 44,
|
||||
PMLOG_THROTTLER_STATUS_CPU = 45,
|
||||
PMLOG_SSPAIRED_ASICPOWER = 46, // apuPower
|
||||
PMLOG_SSTOTAL_POWERLIMIT = 47, // Total Power limit
|
||||
PMLOG_SSAPU_POWERLIMIT = 48, // APU Power limit
|
||||
PMLOG_SSDGPU_POWERLIMIT = 49, // DGPU Power limit
|
||||
PMLOG_TEMPERATURE_HOTSPOT_GCD = 50,
|
||||
PMLOG_TEMPERATURE_HOTSPOT_MCD = 51,
|
||||
PMLOG_THROTTLER_TEMP_EDGE_PERCENTAGE = 52,
|
||||
PMLOG_THROTTLER_TEMP_HOTSPOT_PERCENTAGE = 53,
|
||||
PMLOG_THROTTLER_TEMP_HOTSPOT_GCD_PERCENTAGE = 54,
|
||||
PMLOG_THROTTLER_TEMP_HOTSPOT_MCD_PERCENTAGE = 55,
|
||||
PMLOG_THROTTLER_TEMP_MEM_PERCENTAGE = 56,
|
||||
PMLOG_THROTTLER_TEMP_VR_GFX_PERCENTAGE = 57,
|
||||
PMLOG_THROTTLER_TEMP_VR_MEM0_PERCENTAGE = 58,
|
||||
PMLOG_THROTTLER_TEMP_VR_MEM1_PERCENTAGE = 59,
|
||||
PMLOG_THROTTLER_TEMP_VR_SOC_PERCENTAGE = 60,
|
||||
PMLOG_THROTTLER_TEMP_LIQUID0_PERCENTAGE = 61,
|
||||
PMLOG_THROTTLER_TEMP_LIQUID1_PERCENTAGE = 62,
|
||||
PMLOG_THROTTLER_TEMP_PLX_PERCENTAGE = 63,
|
||||
PMLOG_THROTTLER_TDC_GFX_PERCENTAGE = 64,
|
||||
PMLOG_THROTTLER_TDC_SOC_PERCENTAGE = 65,
|
||||
PMLOG_THROTTLER_TDC_USR_PERCENTAGE = 66,
|
||||
PMLOG_THROTTLER_PPT0_PERCENTAGE = 67,
|
||||
PMLOG_THROTTLER_PPT1_PERCENTAGE = 68,
|
||||
PMLOG_THROTTLER_PPT2_PERCENTAGE = 69,
|
||||
PMLOG_THROTTLER_PPT3_PERCENTAGE = 70,
|
||||
PMLOG_THROTTLER_FIT_PERCENTAGE = 71,
|
||||
PMLOG_THROTTLER_GFX_APCC_PLUS_PERCENTAGE = 72,
|
||||
PMLOG_BOARD_POWER = 73,
|
||||
PMLOG_MAX_SENSORS_REAL
|
||||
};
|
||||
|
||||
//Throttle Status
|
||||
[Flags]
|
||||
public enum ADL_THROTTLE_NOTIFICATION {
|
||||
ADL_PMLOG_THROTTLE_POWER = 1 << 0,
|
||||
ADL_PMLOG_THROTTLE_THERMAL = 1 << 1,
|
||||
ADL_PMLOG_THROTTLE_CURRENT = 1 << 2,
|
||||
};
|
||||
|
||||
public enum ADL_PMLOG_SENSORS {
|
||||
ADL_SENSOR_MAXTYPES = 0,
|
||||
ADL_PMLOG_CLK_GFXCLK = 1,
|
||||
ADL_PMLOG_CLK_MEMCLK = 2,
|
||||
ADL_PMLOG_CLK_SOCCLK = 3,
|
||||
ADL_PMLOG_CLK_UVDCLK1 = 4,
|
||||
ADL_PMLOG_CLK_UVDCLK2 = 5,
|
||||
ADL_PMLOG_CLK_VCECLK = 6,
|
||||
ADL_PMLOG_CLK_VCNCLK = 7,
|
||||
ADL_PMLOG_TEMPERATURE_EDGE = 8,
|
||||
ADL_PMLOG_TEMPERATURE_MEM = 9,
|
||||
ADL_PMLOG_TEMPERATURE_VRVDDC = 10,
|
||||
ADL_PMLOG_TEMPERATURE_VRMVDD = 11,
|
||||
ADL_PMLOG_TEMPERATURE_LIQUID = 12,
|
||||
ADL_PMLOG_TEMPERATURE_PLX = 13,
|
||||
ADL_PMLOG_FAN_RPM = 14,
|
||||
ADL_PMLOG_FAN_PERCENTAGE = 15,
|
||||
ADL_PMLOG_SOC_VOLTAGE = 16,
|
||||
ADL_PMLOG_SOC_POWER = 17,
|
||||
ADL_PMLOG_SOC_CURRENT = 18,
|
||||
ADL_PMLOG_INFO_ACTIVITY_GFX = 19,
|
||||
ADL_PMLOG_INFO_ACTIVITY_MEM = 20,
|
||||
ADL_PMLOG_GFX_VOLTAGE = 21,
|
||||
ADL_PMLOG_MEM_VOLTAGE = 22,
|
||||
ADL_PMLOG_ASIC_POWER = 23,
|
||||
ADL_PMLOG_TEMPERATURE_VRSOC = 24,
|
||||
ADL_PMLOG_TEMPERATURE_VRMVDD0 = 25,
|
||||
ADL_PMLOG_TEMPERATURE_VRMVDD1 = 26,
|
||||
ADL_PMLOG_TEMPERATURE_HOTSPOT = 27,
|
||||
ADL_PMLOG_TEMPERATURE_GFX = 28,
|
||||
ADL_PMLOG_TEMPERATURE_SOC = 29,
|
||||
ADL_PMLOG_GFX_POWER = 30,
|
||||
ADL_PMLOG_GFX_CURRENT = 31,
|
||||
ADL_PMLOG_TEMPERATURE_CPU = 32,
|
||||
ADL_PMLOG_CPU_POWER = 33,
|
||||
ADL_PMLOG_CLK_CPUCLK = 34,
|
||||
ADL_PMLOG_THROTTLER_STATUS = 35, // GFX
|
||||
ADL_PMLOG_CLK_VCN1CLK1 = 36,
|
||||
ADL_PMLOG_CLK_VCN1CLK2 = 37,
|
||||
ADL_PMLOG_SMART_POWERSHIFT_CPU = 38,
|
||||
ADL_PMLOG_SMART_POWERSHIFT_DGPU = 39,
|
||||
ADL_PMLOG_BUS_SPEED = 40,
|
||||
ADL_PMLOG_BUS_LANES = 41,
|
||||
ADL_PMLOG_TEMPERATURE_LIQUID0 = 42,
|
||||
ADL_PMLOG_TEMPERATURE_LIQUID1 = 43,
|
||||
ADL_PMLOG_CLK_FCLK = 44,
|
||||
ADL_PMLOG_THROTTLER_STATUS_CPU = 45,
|
||||
ADL_PMLOG_SSPAIRED_ASICPOWER = 46, // apuPower
|
||||
ADL_PMLOG_SSTOTAL_POWERLIMIT = 47, // Total Power limit
|
||||
ADL_PMLOG_SSAPU_POWERLIMIT = 48, // APU Power limit
|
||||
ADL_PMLOG_SSDGPU_POWERLIMIT = 49, // DGPU Power limit
|
||||
ADL_PMLOG_TEMPERATURE_HOTSPOT_GCD = 50,
|
||||
ADL_PMLOG_TEMPERATURE_HOTSPOT_MCD = 51,
|
||||
ADL_PMLOG_THROTTLER_TEMP_EDGE_PERCENTAGE = 52,
|
||||
ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_PERCENTAGE = 53,
|
||||
ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_GCD_PERCENTAGE = 54,
|
||||
ADL_PMLOG_THROTTLER_TEMP_HOTSPOT_MCD_PERCENTAGE = 55,
|
||||
ADL_PMLOG_THROTTLER_TEMP_MEM_PERCENTAGE = 56,
|
||||
ADL_PMLOG_THROTTLER_TEMP_VR_GFX_PERCENTAGE = 57,
|
||||
ADL_PMLOG_THROTTLER_TEMP_VR_MEM0_PERCENTAGE = 58,
|
||||
ADL_PMLOG_THROTTLER_TEMP_VR_MEM1_PERCENTAGE = 59,
|
||||
ADL_PMLOG_THROTTLER_TEMP_VR_SOC_PERCENTAGE = 60,
|
||||
ADL_PMLOG_THROTTLER_TEMP_LIQUID0_PERCENTAGE = 61,
|
||||
ADL_PMLOG_THROTTLER_TEMP_LIQUID1_PERCENTAGE = 62,
|
||||
ADL_PMLOG_THROTTLER_TEMP_PLX_PERCENTAGE = 63,
|
||||
ADL_PMLOG_THROTTLER_TDC_GFX_PERCENTAGE = 64,
|
||||
ADL_PMLOG_THROTTLER_TDC_SOC_PERCENTAGE = 65,
|
||||
ADL_PMLOG_THROTTLER_TDC_USR_PERCENTAGE = 66,
|
||||
ADL_PMLOG_THROTTLER_PPT0_PERCENTAGE = 67,
|
||||
ADL_PMLOG_THROTTLER_PPT1_PERCENTAGE = 68,
|
||||
ADL_PMLOG_THROTTLER_PPT2_PERCENTAGE = 69,
|
||||
ADL_PMLOG_THROTTLER_PPT3_PERCENTAGE = 70,
|
||||
ADL_PMLOG_THROTTLER_FIT_PERCENTAGE = 71,
|
||||
ADL_PMLOG_THROTTLER_GFX_APCC_PLUS_PERCENTAGE = 72,
|
||||
ADL_PMLOG_BOARD_POWER = 73,
|
||||
ADL_PMLOG_MAX_SENSORS_REAL
|
||||
}
|
||||
|
||||
#region ADLAdapterInfo
|
||||
|
||||
/// <summary> ADLAdapterInfo Structure</summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLAdapterInfo {
|
||||
/// <summary>The size of the structure</summary>
|
||||
int Size;
|
||||
|
||||
/// <summary> Adapter Index</summary>
|
||||
public int AdapterIndex;
|
||||
|
||||
/// <summary> Adapter UDID</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string UDID;
|
||||
|
||||
/// <summary> Adapter Bus Number</summary>
|
||||
public int BusNumber;
|
||||
|
||||
/// <summary> Adapter Driver Number</summary>
|
||||
public int DriverNumber;
|
||||
|
||||
/// <summary> Adapter Function Number</summary>
|
||||
public int FunctionNumber;
|
||||
|
||||
/// <summary> Adapter Vendor ID</summary>
|
||||
public int VendorID;
|
||||
|
||||
/// <summary> Adapter Adapter name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string AdapterName;
|
||||
|
||||
/// <summary> Adapter Display name</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string DisplayName;
|
||||
|
||||
/// <summary> Adapter Present status</summary>
|
||||
public int Present;
|
||||
|
||||
/// <summary> Adapter Exist status</summary>
|
||||
public int Exist;
|
||||
|
||||
/// <summary> Adapter Driver Path</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string DriverPath;
|
||||
|
||||
/// <summary> Adapter Driver Ext Path</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string DriverPathExt;
|
||||
|
||||
/// <summary> Adapter PNP String</summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string PNPString;
|
||||
|
||||
/// <summary> OS Display Index</summary>
|
||||
public int OSDisplayIndex;
|
||||
}
|
||||
|
||||
/// <summary> ADLAdapterInfo Array</summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLAdapterInfoArray {
|
||||
/// <summary> ADLAdapterInfo Array </summary>
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = Adl2.ADL_MAX_ADAPTERS)]
|
||||
public ADLAdapterInfo[] ADLAdapterInfo;
|
||||
}
|
||||
|
||||
#endregion ADLAdapterInfo
|
||||
|
||||
#region ADLDisplayInfo
|
||||
|
||||
/// <summary> ADLDisplayID Structure</summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLDisplayID {
|
||||
/// <summary> Display Logical Index </summary>
|
||||
public int DisplayLogicalIndex;
|
||||
|
||||
/// <summary> Display Physical Index </summary>
|
||||
public int DisplayPhysicalIndex;
|
||||
|
||||
/// <summary> Adapter Logical Index </summary>
|
||||
public int DisplayLogicalAdapterIndex;
|
||||
|
||||
/// <summary> Adapter Physical Index </summary>
|
||||
public int DisplayPhysicalAdapterIndex;
|
||||
}
|
||||
|
||||
/// <summary> ADLDisplayInfo Structure</summary>
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct ADLDisplayInfo {
|
||||
/// <summary> Display Index </summary>
|
||||
public ADLDisplayID DisplayID;
|
||||
|
||||
/// <summary> Display Controller Index </summary>
|
||||
public int DisplayControllerIndex;
|
||||
|
||||
/// <summary> Display Name </summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string DisplayName;
|
||||
|
||||
/// <summary> Display Manufacturer Name </summary>
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = Adl2.ADL_MAX_PATH)]
|
||||
public string DisplayManufacturerName;
|
||||
|
||||
/// <summary> Display Type : < The Display type. CRT, TV,CV,DFP are some of display types,</summary>
|
||||
public int DisplayType;
|
||||
|
||||
/// <summary> Display output type </summary>
|
||||
public int DisplayOutputType;
|
||||
|
||||
/// <summary> Connector type</summary>
|
||||
public int DisplayConnector;
|
||||
|
||||
///<summary> Indicating the display info bits' mask.<summary>
|
||||
public int DisplayInfoMask;
|
||||
|
||||
///<summary> Indicating the display info value.<summary>
|
||||
public int DisplayInfoValue;
|
||||
}
|
||||
|
||||
#endregion ADLDisplayInfo
|
||||
|
||||
#endregion Export Struct
|
||||
|
||||
public class Adl2 {
|
||||
public const string Atiadlxx_FileName = "atiadlxx.dll";
|
||||
|
||||
#region Internal Constant
|
||||
|
||||
/// <summary> Define the maximum path</summary>
|
||||
public const int ADL_MAX_PATH = 256;
|
||||
|
||||
/// <summary> Define the maximum adapters</summary>
|
||||
public const int ADL_MAX_ADAPTERS = 40 /* 150 */;
|
||||
|
||||
/// <summary> Define the maximum displays</summary>
|
||||
public const int ADL_MAX_DISPLAYS = 40 /* 150 */;
|
||||
|
||||
/// <summary> Define the maximum device name length</summary>
|
||||
public const int ADL_MAX_DEVICENAME = 32;
|
||||
|
||||
/// <summary> Define the successful</summary>
|
||||
public const int ADL_SUCCESS = 0;
|
||||
|
||||
/// <summary> Define the failure</summary>
|
||||
public const int ADL_FAIL = -1;
|
||||
|
||||
/// <summary> Define the driver ok</summary>
|
||||
public const int ADL_DRIVER_OK = 0;
|
||||
|
||||
/// <summary> Maximum number of GL-Sync ports on the GL-Sync module </summary>
|
||||
public const int ADL_MAX_GLSYNC_PORTS = 8;
|
||||
|
||||
/// <summary> Maximum number of GL-Sync ports on the GL-Sync module </summary>
|
||||
public const int ADL_MAX_GLSYNC_PORT_LEDS = 8;
|
||||
|
||||
/// <summary> Maximum number of ADLMOdes for the adapter </summary>
|
||||
public const int ADL_MAX_NUM_DISPLAYMODES = 1024;
|
||||
|
||||
/// <summary> Performance Metrics Log max sensors number </summary>
|
||||
public const int ADL_PMLOG_MAX_SENSORS = 256;
|
||||
|
||||
#endregion Internal Constant
|
||||
|
||||
// ///// <summary> ADL Create Function to create ADL Data</summary>
|
||||
/// <param name="enumConnectedAdapters">If it is 1, then ADL will only return the physical exist adapters </param>
|
||||
///// <returns> retrun ADL Error Code</returns>
|
||||
public static int ADL2_Main_Control_Create(int enumConnectedAdapters, out IntPtr adlContextHandle) {
|
||||
return NativeMethods.ADL2_Main_Control_Create(ADL_Main_Memory_Alloc_Impl_Reference, enumConnectedAdapters, out adlContextHandle);
|
||||
}
|
||||
|
||||
public static void FreeMemory(IntPtr buffer) {
|
||||
Memory_Free_Impl(buffer);
|
||||
}
|
||||
|
||||
private static bool? isDllLoaded;
|
||||
|
||||
public static bool Load() {
|
||||
if (isDllLoaded != null)
|
||||
return isDllLoaded.Value;
|
||||
|
||||
try {
|
||||
Marshal.PrelinkAll(typeof(Adl2));
|
||||
isDllLoaded = true;
|
||||
} catch (Exception e) when (e is DllNotFoundException or EntryPointNotFoundException) {
|
||||
Debug.WriteLine(e);
|
||||
isDllLoaded = false;
|
||||
}
|
||||
|
||||
return isDllLoaded.Value;
|
||||
}
|
||||
|
||||
private static NativeMethods.ADL_Main_Memory_Alloc ADL_Main_Memory_Alloc_Impl_Reference = Memory_Alloc_Impl;
|
||||
|
||||
/// <summary> Build in memory allocation function</summary>
|
||||
/// <param name="size">input size</param>
|
||||
/// <returns>return the memory buffer</returns>
|
||||
private static IntPtr Memory_Alloc_Impl(int size) {
|
||||
return Marshal.AllocCoTaskMem(size);
|
||||
}
|
||||
|
||||
/// <summary> Build in memory free function</summary>
|
||||
/// <param name="buffer">input buffer</param>
|
||||
private static void Memory_Free_Impl(IntPtr buffer) {
|
||||
if (IntPtr.Zero != buffer) {
|
||||
Marshal.FreeCoTaskMem(buffer);
|
||||
}
|
||||
}
|
||||
|
||||
public static class NativeMethods {
|
||||
/// <summary> ADL Memory allocation function allows ADL to callback for memory allocation</summary>
|
||||
/// <param name="size">input size</param>
|
||||
/// <returns> retrun ADL Error Code</returns>
|
||||
public delegate IntPtr ADL_Main_Memory_Alloc(int size);
|
||||
|
||||
// ///// <summary> ADL Create Function to create ADL Data</summary>
|
||||
/// <param name="callback">Call back functin pointer which is ised to allocate memeory </param>
|
||||
/// <param name="enumConnectedAdapters">If it is 1, then ADL will only retuen the physical exist adapters </param>
|
||||
///// <returns> retrun ADL Error Code</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Main_Control_Create(ADL_Main_Memory_Alloc callback, int enumConnectedAdapters, out IntPtr adlContextHandle);
|
||||
|
||||
/// <summary> ADL Destroy Function to free up ADL Data</summary>
|
||||
/// <returns> retrun ADL Error Code</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Main_Control_Destroy(IntPtr adlContextHandle);
|
||||
|
||||
/// <summary> ADL Function to get the number of adapters</summary>
|
||||
/// <param name="numAdapters">return number of adapters</param>
|
||||
/// <returns> retrun ADL Error Code</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Adapter_NumberOfAdapters_Get(IntPtr adlContextHandle, out int numAdapters);
|
||||
|
||||
/// <summary> ADL Function to get the GPU adapter information</summary>
|
||||
/// <param name="info">return GPU adapter information</param>
|
||||
/// <param name="inputSize">the size of the GPU adapter struct</param>
|
||||
/// <returns> retrun ADL Error Code</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Adapter_AdapterInfo_Get(IntPtr adlContextHandle, IntPtr info, int inputSize);
|
||||
|
||||
/// <summary> Function to determine if the adapter is active or not.</summary>
|
||||
/// <remarks>The function is used to check if the adapter associated with iAdapterIndex is active</remarks>
|
||||
/// <param name="adapterIndex"> Adapter Index.</param>
|
||||
/// <param name="status"> Status of the adapter. True: Active; False: Dsiabled</param>
|
||||
/// <returns>Non zero is successfull</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Adapter_Active_Get(IntPtr adlContextHandle, int adapterIndex, out int status);
|
||||
|
||||
/// <summary>Get display information based on adapter index</summary>
|
||||
/// <param name="adapterIndex">Adapter Index</param>
|
||||
/// <param name="numDisplays">return the total number of supported displays</param>
|
||||
/// <param name="displayInfoArray">return ADLDisplayInfo Array for supported displays' information</param>
|
||||
/// <param name="forceDetect">force detect or not</param>
|
||||
/// <returns>return ADL Error Code</returns>
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Display_DisplayInfo_Get(
|
||||
IntPtr adlContextHandle,
|
||||
int adapterIndex,
|
||||
out int numDisplays,
|
||||
out IntPtr displayInfoArray,
|
||||
int forceDetect
|
||||
);
|
||||
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Overdrive_Caps(
|
||||
IntPtr adlContextHandle,
|
||||
int adapterIndex,
|
||||
out int supported,
|
||||
out int enabled,
|
||||
out int version
|
||||
);
|
||||
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_New_QueryPMLogData_Get(IntPtr adlContextHandle, int adapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput);
|
||||
|
||||
[DllImport(Atiadlxx_FileName)]
|
||||
public static extern int ADL2_Adapter_ASICFamilyType_Get(IntPtr adlContextHandle, int adapterIndex, out ADLAsicFamilyType asicFamilyType, out int asicFamilyTypeValids);
|
||||
}
|
||||
}
|
||||
110
app/Gpu/AmdGpuTemperatureProvider.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using AmdAdl2;
|
||||
|
||||
namespace GHelper.Gpu;
|
||||
|
||||
// Reference: https://github.com/GPUOpen-LibrariesAndSDKs/display-library/blob/master/Sample-Managed/Program.cs
|
||||
public class AmdGpuTemperatureProvider : IGpuTemperatureProvider {
|
||||
private bool _isReady;
|
||||
private IntPtr _adlContextHandle;
|
||||
private readonly ADLAdapterInfo _internalDiscreteAdapter;
|
||||
|
||||
public AmdGpuTemperatureProvider() {
|
||||
if (!Adl2.Load())
|
||||
return;
|
||||
|
||||
if (Adl2.ADL2_Main_Control_Create(1, out _adlContextHandle) != Adl2.ADL_SUCCESS)
|
||||
return;
|
||||
|
||||
Adl2.NativeMethods.ADL2_Adapter_NumberOfAdapters_Get(_adlContextHandle, out int numberOfAdapters);
|
||||
if (numberOfAdapters <= 0)
|
||||
return;
|
||||
|
||||
ADLAdapterInfoArray osAdapterInfoData = new();
|
||||
int osAdapterInfoDataSize = Marshal.SizeOf(osAdapterInfoData);
|
||||
IntPtr AdapterBuffer = Marshal.AllocCoTaskMem(osAdapterInfoDataSize);
|
||||
Marshal.StructureToPtr(osAdapterInfoData, AdapterBuffer, false);
|
||||
if (Adl2.NativeMethods.ADL2_Adapter_AdapterInfo_Get(_adlContextHandle, AdapterBuffer, osAdapterInfoDataSize) != Adl2.ADL_SUCCESS)
|
||||
return;
|
||||
|
||||
osAdapterInfoData = (ADLAdapterInfoArray) Marshal.PtrToStructure(AdapterBuffer, osAdapterInfoData.GetType())!;
|
||||
|
||||
const int amdVendorId = 1002;
|
||||
|
||||
// Determine which GPU is internal discrete AMD GPU
|
||||
ADLAdapterInfo internalDiscreteAdapter =
|
||||
osAdapterInfoData.ADLAdapterInfo
|
||||
.FirstOrDefault(adapter => {
|
||||
if (adapter.Exist == 0 || adapter.Present == 0)
|
||||
return false;
|
||||
|
||||
if (adapter.VendorID != amdVendorId)
|
||||
return false;
|
||||
|
||||
if (Adl2.NativeMethods.ADL2_Adapter_ASICFamilyType_Get(_adlContextHandle, adapter.AdapterIndex, out ADLAsicFamilyType asicFamilyType, out int asicFamilyTypeValids) != Adl2.ADL_SUCCESS)
|
||||
return false;
|
||||
|
||||
asicFamilyType = (ADLAsicFamilyType) ((int) asicFamilyType & asicFamilyTypeValids);
|
||||
|
||||
// FIXME: is this correct for G14 2022?
|
||||
return (asicFamilyType & ADLAsicFamilyType.Discrete) != 0;
|
||||
});
|
||||
|
||||
if (internalDiscreteAdapter.Exist == 0)
|
||||
return;
|
||||
|
||||
_internalDiscreteAdapter = internalDiscreteAdapter;
|
||||
_isReady = true;
|
||||
}
|
||||
|
||||
public bool IsValid => _isReady && _adlContextHandle != IntPtr.Zero;
|
||||
|
||||
public int? GetCurrentTemperature() {
|
||||
if (!IsValid)
|
||||
return null;
|
||||
|
||||
if (Adl2.NativeMethods.ADL2_New_QueryPMLogData_Get(_adlContextHandle, _internalDiscreteAdapter.AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS)
|
||||
return null;
|
||||
|
||||
ADLSingleSensorData temperatureSensor = adlpmLogDataOutput.Sensors[(int) ADLSensorType.PMLOG_TEMPERATURE_EDGE];
|
||||
if (temperatureSensor.Supported == 0)
|
||||
return null;
|
||||
|
||||
return temperatureSensor.Value;
|
||||
}
|
||||
|
||||
|
||||
public int? GetGpuUse()
|
||||
{
|
||||
if (!IsValid)
|
||||
return null;
|
||||
|
||||
if (Adl2.NativeMethods.ADL2_New_QueryPMLogData_Get(_adlContextHandle, _internalDiscreteAdapter.AdapterIndex, out ADLPMLogDataOutput adlpmLogDataOutput) != Adl2.ADL_SUCCESS)
|
||||
return null;
|
||||
|
||||
ADLSingleSensorData gpuUsage = adlpmLogDataOutput.Sensors[(int)ADLSensorType.PMLOG_INFO_ACTIVITY_GFX];
|
||||
if (gpuUsage.Supported == 0)
|
||||
return null;
|
||||
|
||||
return gpuUsage.Value;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void ReleaseUnmanagedResources() {
|
||||
if (_adlContextHandle != IntPtr.Zero) {
|
||||
Adl2.NativeMethods.ADL2_Main_Control_Destroy(_adlContextHandle);
|
||||
_adlContextHandle = IntPtr.Zero;
|
||||
_isReady = false;
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose() {
|
||||
ReleaseUnmanagedResources();
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
|
||||
~AmdGpuTemperatureProvider() {
|
||||
ReleaseUnmanagedResources();
|
||||
}
|
||||
}
|
||||
7
app/Gpu/IGpuTemperatureProvider.cs
Normal file
@@ -0,0 +1,7 @@
|
||||
namespace GHelper.Gpu;
|
||||
|
||||
public interface IGpuTemperatureProvider : IDisposable {
|
||||
bool IsValid { get; }
|
||||
int? GetCurrentTemperature();
|
||||
int? GetGpuUse();
|
||||
}
|
||||
68
app/Gpu/NvidiaGpuTemperatureProvider.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
using NvAPIWrapper.GPU;
|
||||
using NvAPIWrapper.Native;
|
||||
using NvAPIWrapper.Native.GPU;
|
||||
using NvAPIWrapper.Native.Interfaces.GPU;
|
||||
|
||||
namespace GHelper.Gpu;
|
||||
|
||||
public class NvidiaGpuTemperatureProvider : IGpuTemperatureProvider
|
||||
{
|
||||
private readonly PhysicalGPU? _internalGpu;
|
||||
|
||||
public NvidiaGpuTemperatureProvider()
|
||||
{
|
||||
_internalGpu = GetInternalDiscreteGpu();
|
||||
}
|
||||
|
||||
public bool IsValid => _internalGpu != null;
|
||||
|
||||
public int? GetCurrentTemperature()
|
||||
{
|
||||
if (!IsValid)
|
||||
return null;
|
||||
|
||||
PhysicalGPU internalGpu = _internalGpu!;
|
||||
IThermalSensor? gpuSensor =
|
||||
GPUApi.GetThermalSettings(internalGpu.Handle).Sensors
|
||||
.FirstOrDefault(s => s.Target == ThermalSettingsTarget.GPU);
|
||||
|
||||
return gpuSensor?.CurrentTemperature;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
}
|
||||
|
||||
private static PhysicalGPU? GetInternalDiscreteGpu()
|
||||
{
|
||||
try
|
||||
{
|
||||
return PhysicalGPU
|
||||
.GetPhysicalGPUs()
|
||||
.FirstOrDefault(gpu => gpu.SystemType == SystemType.Laptop);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public int? GetGpuUse()
|
||||
{
|
||||
if (!IsValid)
|
||||
return null;
|
||||
|
||||
PhysicalGPU internalGpu = _internalGpu!;
|
||||
|
||||
IUtilizationDomainInfo? gpuUsage = GPUApi.GetUsages(internalGpu.Handle).GPU;
|
||||
|
||||
if (gpuUsage == null)
|
||||
return null;
|
||||
|
||||
return
|
||||
(int)gpuUsage?.Percentage;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
175
app/HardwareMonitor.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using GHelper;
|
||||
using GHelper.Gpu;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
|
||||
public static class HardwareMonitor
|
||||
{
|
||||
private static IGpuTemperatureProvider? GpuTemperatureProvider;
|
||||
|
||||
public static float? cpuTemp = -1;
|
||||
public static float? batteryDischarge = -1;
|
||||
public static int? gpuTemp = null;
|
||||
|
||||
public static string? cpuFan;
|
||||
public static string? gpuFan;
|
||||
public static string? midFan;
|
||||
|
||||
//public static List<int> gpuUsage = new List<int>();
|
||||
public static int? gpuUse;
|
||||
|
||||
public static int GetFanMax()
|
||||
{
|
||||
int max = 58;
|
||||
if (Program.config.ContainsModel("401")) max = 72;
|
||||
else if (Program.config.ContainsModel("503")) max = 68;
|
||||
return Math.Max(max, Program.config.getConfig("fan_max"));
|
||||
}
|
||||
|
||||
public static void SetFanMax(int fan)
|
||||
{
|
||||
Program.config.setConfig("fan_max", fan);
|
||||
}
|
||||
private static string FormatFan(int fan)
|
||||
{
|
||||
// fix for old models
|
||||
if (fan < 0)
|
||||
{
|
||||
fan += 65536;
|
||||
if (fan <= 0 || fan > 100) return null; //nothing reasonable
|
||||
}
|
||||
|
||||
int fanMax = GetFanMax();
|
||||
if (fan > fanMax) SetFanMax(fan);
|
||||
|
||||
if (Program.config.getConfig("fan_rpm") == 1)
|
||||
return " Fan: " + (fan * 100).ToString() + "RPM";
|
||||
else
|
||||
return " Fan: " + Math.Min(Math.Round((float)fan / fanMax * 100), 100).ToString() + "%"; // relatively to 6000 rpm
|
||||
}
|
||||
|
||||
private static int GetGpuUse()
|
||||
{
|
||||
try
|
||||
{
|
||||
int? gpuUse = GpuTemperatureProvider?.GetGpuUse();
|
||||
if (gpuUse is not null) return (int)gpuUse;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine(ex.ToString());
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
public static void ReadSensors()
|
||||
{
|
||||
batteryDischarge = -1;
|
||||
gpuTemp = -1;
|
||||
gpuUse = -1;
|
||||
|
||||
cpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.CPU_Fan));
|
||||
gpuFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.GPU_Fan));
|
||||
midFan = FormatFan(Program.wmi.DeviceGet(ASUSWmi.Mid_Fan));
|
||||
|
||||
cpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_CPU);
|
||||
|
||||
if (cpuTemp < 0) try
|
||||
{
|
||||
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
|
||||
cpuTemp = ct.NextValue() - 273;
|
||||
ct.Dispose();
|
||||
}
|
||||
catch
|
||||
{
|
||||
Debug.WriteLine("Failed reading CPU temp");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
gpuTemp = GpuTemperatureProvider?.GetCurrentTemperature();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
gpuTemp = -1;
|
||||
Debug.WriteLine("Failed reading GPU temp");
|
||||
Debug.WriteLine(ex.ToString());
|
||||
}
|
||||
|
||||
if (gpuTemp is null || gpuTemp < 0)
|
||||
gpuTemp = Program.wmi.DeviceGet(ASUSWmi.Temp_GPU);
|
||||
|
||||
/*
|
||||
gpuUsage.Add(GetGpuUse());
|
||||
if (gpuUsage.Count > 3) gpuUsage.RemoveAt(0);
|
||||
*/
|
||||
|
||||
try
|
||||
{
|
||||
var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
|
||||
batteryDischarge = cb.NextValue() / 1000;
|
||||
cb.Dispose();
|
||||
|
||||
}
|
||||
catch
|
||||
{
|
||||
Debug.WriteLine("Failed reading Battery discharge");
|
||||
}
|
||||
}
|
||||
|
||||
public static bool IsUsedGPU(int threshold = 50)
|
||||
{
|
||||
return (GetGpuUse() > threshold);
|
||||
}
|
||||
|
||||
public static void RecreateGpuTemperatureProviderWithDelay()
|
||||
{
|
||||
|
||||
// Re-enabling the discrete GPU takes a bit of time,
|
||||
// so a simple workaround is to refresh again after that happens
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(TimeSpan.FromSeconds(5));
|
||||
RecreateGpuTemperatureProvider();
|
||||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void RecreateGpuTemperatureProvider()
|
||||
{
|
||||
try
|
||||
{
|
||||
GpuTemperatureProvider?.Dispose();
|
||||
|
||||
// Detect valid GPU temperature provider.
|
||||
// We start with NVIDIA because there's always at least an integrated AMD GPU
|
||||
IGpuTemperatureProvider gpuTemperatureProvider = new NvidiaGpuTemperatureProvider();
|
||||
if (gpuTemperatureProvider.IsValid)
|
||||
{
|
||||
GpuTemperatureProvider = gpuTemperatureProvider;
|
||||
return;
|
||||
}
|
||||
|
||||
gpuTemperatureProvider.Dispose();
|
||||
gpuTemperatureProvider = new AmdGpuTemperatureProvider();
|
||||
if (gpuTemperatureProvider.IsValid)
|
||||
{
|
||||
GpuTemperatureProvider = gpuTemperatureProvider;
|
||||
return;
|
||||
}
|
||||
|
||||
gpuTemperatureProvider.Dispose();
|
||||
|
||||
GpuTemperatureProvider = null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine(ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
329
app/Keyboard.Designer.cs
generated
Normal file
@@ -0,0 +1,329 @@
|
||||
using CustomControls;
|
||||
|
||||
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();
|
||||
textFNF4 = new TextBox();
|
||||
comboFNF4 = new RComboBox();
|
||||
labelFNF4 = new Label();
|
||||
textM4 = new TextBox();
|
||||
textM3 = new TextBox();
|
||||
comboM4 = new RComboBox();
|
||||
labelM4 = new Label();
|
||||
comboM3 = new RComboBox();
|
||||
labelM3 = new Label();
|
||||
groupLight = new GroupBox();
|
||||
labelSpeed = new Label();
|
||||
comboKeyboardSpeed = new RComboBox();
|
||||
checkShutdown = new CheckBox();
|
||||
checkSleep = new CheckBox();
|
||||
checkBoot = new CheckBox();
|
||||
checkAwake = new CheckBox();
|
||||
groupOther = new GroupBox();
|
||||
checkKeyboardAuto = new CheckBox();
|
||||
checkTopmost = new CheckBox();
|
||||
checkNoOverdrive = new CheckBox();
|
||||
groupBox1.SuspendLayout();
|
||||
groupLight.SuspendLayout();
|
||||
groupOther.SuspendLayout();
|
||||
SuspendLayout();
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
groupBox1.Controls.Add(textFNF4);
|
||||
groupBox1.Controls.Add(comboFNF4);
|
||||
groupBox1.Controls.Add(labelFNF4);
|
||||
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(756, 242);
|
||||
groupBox1.TabIndex = 0;
|
||||
groupBox1.TabStop = false;
|
||||
groupBox1.Text = "Key Bindings";
|
||||
//
|
||||
// textFNF4
|
||||
//
|
||||
textFNF4.Location = new Point(411, 176);
|
||||
textFNF4.Name = "textFNF4";
|
||||
textFNF4.PlaceholderText = "action";
|
||||
textFNF4.Size = new Size(320, 39);
|
||||
textFNF4.TabIndex = 8;
|
||||
//
|
||||
// comboFNF4
|
||||
//
|
||||
comboFNF4.FormattingEnabled = true;
|
||||
comboFNF4.Location = new Point(93, 175);
|
||||
comboFNF4.Name = "comboFNF4";
|
||||
comboFNF4.Size = new Size(312, 40);
|
||||
comboFNF4.TabIndex = 7;
|
||||
//
|
||||
// labelFNF4
|
||||
//
|
||||
labelFNF4.AutoSize = true;
|
||||
labelFNF4.Location = new Point(2, 178);
|
||||
labelFNF4.Name = "labelFNF4";
|
||||
labelFNF4.Size = new Size(90, 32);
|
||||
labelFNF4.TabIndex = 6;
|
||||
labelFNF4.Text = "FN+F4:";
|
||||
//
|
||||
// textM4
|
||||
//
|
||||
textM4.Location = new Point(411, 113);
|
||||
textM4.Name = "textM4";
|
||||
textM4.PlaceholderText = "action";
|
||||
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[] { "Default", "Volume Mute", "Play / Pause", "PrintScreen", "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:";
|
||||
//
|
||||
// groupLight
|
||||
//
|
||||
groupLight.Controls.Add(labelSpeed);
|
||||
groupLight.Controls.Add(comboKeyboardSpeed);
|
||||
groupLight.Controls.Add(checkShutdown);
|
||||
groupLight.Controls.Add(checkSleep);
|
||||
groupLight.Controls.Add(checkBoot);
|
||||
groupLight.Controls.Add(checkAwake);
|
||||
groupLight.Dock = DockStyle.Top;
|
||||
groupLight.Location = new Point(10, 252);
|
||||
groupLight.Name = "groupLight";
|
||||
groupLight.Size = new Size(756, 304);
|
||||
groupLight.TabIndex = 1;
|
||||
groupLight.TabStop = false;
|
||||
groupLight.Text = "Keyboard Backlight";
|
||||
//
|
||||
// labelSpeed
|
||||
//
|
||||
labelSpeed.AutoSize = true;
|
||||
labelSpeed.Location = new Point(25, 237);
|
||||
labelSpeed.Name = "labelSpeed";
|
||||
labelSpeed.Size = new Size(198, 32);
|
||||
labelSpeed.TabIndex = 40;
|
||||
labelSpeed.Text = "Animation Speed";
|
||||
//
|
||||
// comboKeyboardSpeed
|
||||
//
|
||||
comboKeyboardSpeed.BorderColor = Color.White;
|
||||
comboKeyboardSpeed.ButtonColor = SystemColors.ControlLight;
|
||||
comboKeyboardSpeed.FlatStyle = FlatStyle.Flat;
|
||||
comboKeyboardSpeed.Font = new Font("Segoe UI", 9F, FontStyle.Regular, GraphicsUnit.Point);
|
||||
comboKeyboardSpeed.FormattingEnabled = true;
|
||||
comboKeyboardSpeed.ItemHeight = 32;
|
||||
comboKeyboardSpeed.Items.AddRange(new object[] { "Slow", "Normal", "Fast" });
|
||||
comboKeyboardSpeed.Location = new Point(230, 234);
|
||||
comboKeyboardSpeed.Margin = new Padding(4, 10, 4, 8);
|
||||
comboKeyboardSpeed.Name = "comboKeyboardSpeed";
|
||||
comboKeyboardSpeed.Size = new Size(291, 40);
|
||||
comboKeyboardSpeed.TabIndex = 39;
|
||||
comboKeyboardSpeed.TabStop = false;
|
||||
//
|
||||
// checkShutdown
|
||||
//
|
||||
checkShutdown.AutoSize = true;
|
||||
checkShutdown.Location = new Point(25, 185);
|
||||
checkShutdown.Name = "checkShutdown";
|
||||
checkShutdown.Size = new Size(154, 36);
|
||||
checkShutdown.TabIndex = 3;
|
||||
checkShutdown.Text = "Shutdown";
|
||||
checkShutdown.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkSleep
|
||||
//
|
||||
checkSleep.AutoSize = true;
|
||||
checkSleep.Location = new Point(25, 143);
|
||||
checkSleep.Name = "checkSleep";
|
||||
checkSleep.Size = new Size(105, 36);
|
||||
checkSleep.TabIndex = 2;
|
||||
checkSleep.Text = "Sleep";
|
||||
checkSleep.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBoot
|
||||
//
|
||||
checkBoot.AutoSize = true;
|
||||
checkBoot.Location = new Point(25, 101);
|
||||
checkBoot.Name = "checkBoot";
|
||||
checkBoot.Size = new Size(96, 36);
|
||||
checkBoot.TabIndex = 1;
|
||||
checkBoot.Text = "Boot";
|
||||
checkBoot.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkAwake
|
||||
//
|
||||
checkAwake.AutoSize = true;
|
||||
checkAwake.Location = new Point(25, 59);
|
||||
checkAwake.Name = "checkAwake";
|
||||
checkAwake.Size = new Size(115, 36);
|
||||
checkAwake.TabIndex = 0;
|
||||
checkAwake.Text = "Awake";
|
||||
checkAwake.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// groupOther
|
||||
//
|
||||
groupOther.Controls.Add(checkNoOverdrive);
|
||||
groupOther.Controls.Add(checkKeyboardAuto);
|
||||
groupOther.Controls.Add(checkTopmost);
|
||||
groupOther.Dock = DockStyle.Top;
|
||||
groupOther.Location = new Point(10, 556);
|
||||
groupOther.Name = "groupOther";
|
||||
groupOther.Size = new Size(756, 225);
|
||||
groupOther.TabIndex = 2;
|
||||
groupOther.TabStop = false;
|
||||
groupOther.Text = "Other";
|
||||
//
|
||||
// checkKeyboardAuto
|
||||
//
|
||||
checkKeyboardAuto.AutoSize = true;
|
||||
checkKeyboardAuto.Location = new Point(25, 51);
|
||||
checkKeyboardAuto.Name = "checkKeyboardAuto";
|
||||
checkKeyboardAuto.Size = new Size(712, 36);
|
||||
checkKeyboardAuto.TabIndex = 2;
|
||||
checkKeyboardAuto.Text = "Lower backlight brightness on battery and back when plugged";
|
||||
checkKeyboardAuto.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkTopmost
|
||||
//
|
||||
checkTopmost.AutoSize = true;
|
||||
checkTopmost.Location = new Point(25, 104);
|
||||
checkTopmost.Name = "checkTopmost";
|
||||
checkTopmost.Size = new Size(390, 36);
|
||||
checkTopmost.TabIndex = 1;
|
||||
checkTopmost.Text = "Keep app window always on top";
|
||||
checkTopmost.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkNoOverdrive
|
||||
//
|
||||
checkNoOverdrive.AutoSize = true;
|
||||
checkNoOverdrive.Location = new Point(25, 156);
|
||||
checkNoOverdrive.Name = "checkNoOverdrive";
|
||||
checkNoOverdrive.Size = new Size(307, 36);
|
||||
checkNoOverdrive.TabIndex = 3;
|
||||
checkNoOverdrive.Text = "Disable screen overdrive";
|
||||
checkNoOverdrive.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// Keyboard
|
||||
//
|
||||
AutoScaleDimensions = new SizeF(13F, 32F);
|
||||
AutoScaleMode = AutoScaleMode.Font;
|
||||
ClientSize = new Size(776, 858);
|
||||
Controls.Add(groupOther);
|
||||
Controls.Add(groupLight);
|
||||
Controls.Add(groupBox1);
|
||||
FormBorderStyle = FormBorderStyle.FixedSingle;
|
||||
MaximizeBox = false;
|
||||
MdiChildrenMinimizedAnchorBottom = false;
|
||||
MinimizeBox = false;
|
||||
Name = "Keyboard";
|
||||
Padding = new Padding(10);
|
||||
ShowIcon = false;
|
||||
ShowInTaskbar = false;
|
||||
Text = "Extra Settings";
|
||||
groupBox1.ResumeLayout(false);
|
||||
groupBox1.PerformLayout();
|
||||
groupLight.ResumeLayout(false);
|
||||
groupLight.PerformLayout();
|
||||
groupOther.ResumeLayout(false);
|
||||
groupOther.PerformLayout();
|
||||
ResumeLayout(false);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private GroupBox groupBox1;
|
||||
private Label labelM3;
|
||||
private RComboBox comboM3;
|
||||
private RComboBox comboM4;
|
||||
private Label labelM4;
|
||||
private TextBox textM4;
|
||||
private TextBox textM3;
|
||||
private TextBox textFNF4;
|
||||
private RComboBox comboFNF4;
|
||||
private Label labelFNF4;
|
||||
private GroupBox groupLight;
|
||||
private CheckBox checkSleep;
|
||||
private CheckBox checkBoot;
|
||||
private CheckBox checkAwake;
|
||||
private CheckBox checkShutdown;
|
||||
private Label labelSpeed;
|
||||
private RComboBox comboKeyboardSpeed;
|
||||
private GroupBox groupOther;
|
||||
private CheckBox checkTopmost;
|
||||
private CheckBox checkKeyboardAuto;
|
||||
private CheckBox checkNoOverdrive;
|
||||
}
|
||||
}
|
||||
143
app/Keyboard.cs
Normal file
@@ -0,0 +1,143 @@
|
||||
using CustomControls;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace GHelper
|
||||
{
|
||||
public partial class Keyboard : RForm
|
||||
{
|
||||
|
||||
Dictionary<string, string> customActions = new Dictionary<string, string>
|
||||
{
|
||||
{"","--------------" },
|
||||
{"mute", "Volume Mute"},
|
||||
{"screenshot", "Screenshot"},
|
||||
{"play", "Play/Pause"},
|
||||
{"aura", "Aura"},
|
||||
{"ghelper", "Open GHelper"},
|
||||
{"custom", "Custom"}
|
||||
};
|
||||
|
||||
private void SetKeyCombo(ComboBox combo, TextBox txbox, string name)
|
||||
{
|
||||
if (name == "m4")
|
||||
customActions[""] = "Performance";
|
||||
|
||||
if (name == "fnf4")
|
||||
{
|
||||
customActions[""] = "Aura";
|
||||
customActions.Remove("aura");
|
||||
}
|
||||
|
||||
combo.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
combo.DataSource = new BindingSource(customActions, null);
|
||||
combo.DisplayMember = "Value";
|
||||
combo.ValueMember = "Key";
|
||||
|
||||
string action = Program.config.getConfigString(name);
|
||||
|
||||
combo.SelectedValue = (action is not null) ? action : "";
|
||||
if (combo.SelectedValue is null) combo.SelectedValue = "";
|
||||
|
||||
combo.SelectedValueChanged += delegate
|
||||
{
|
||||
if (combo.SelectedValue is not null)
|
||||
Program.config.setConfig(name, combo.SelectedValue.ToString());
|
||||
};
|
||||
|
||||
txbox.Text = Program.config.getConfigString(name + "_custom");
|
||||
txbox.TextChanged += delegate
|
||||
{
|
||||
Program.config.setConfig(name + "_custom", txbox.Text);
|
||||
};
|
||||
}
|
||||
|
||||
public Keyboard()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitTheme();
|
||||
|
||||
SetKeyCombo(comboM3, textM3, "m3");
|
||||
SetKeyCombo(comboM4, textM4, "m4");
|
||||
SetKeyCombo(comboFNF4, textFNF4, "fnf4");
|
||||
|
||||
Shown += Keyboard_Shown;
|
||||
|
||||
comboKeyboardSpeed.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||
comboKeyboardSpeed.DataSource = new BindingSource(Aura.GetSpeeds(), null);
|
||||
comboKeyboardSpeed.DisplayMember = "Value";
|
||||
comboKeyboardSpeed.ValueMember = "Key";
|
||||
comboKeyboardSpeed.SelectedValue = Aura.Speed;
|
||||
comboKeyboardSpeed.SelectedValueChanged += ComboKeyboardSpeed_SelectedValueChanged;
|
||||
|
||||
checkAwake.Checked = !(Program.config.getConfig("keyboard_awake") == 0);
|
||||
checkBoot.Checked = !(Program.config.getConfig("keyboard_boot") == 0);
|
||||
checkSleep.Checked = !(Program.config.getConfig("keyboard_sleep") == 0);
|
||||
checkShutdown.Checked = !(Program.config.getConfig("keyboard_shutdown") == 0);
|
||||
|
||||
checkAwake.CheckedChanged += CheckPower_CheckedChanged;
|
||||
checkBoot.CheckedChanged += CheckPower_CheckedChanged;
|
||||
checkSleep.CheckedChanged += CheckPower_CheckedChanged;
|
||||
checkShutdown.CheckedChanged += CheckPower_CheckedChanged;
|
||||
|
||||
checkTopmost.Checked = (Program.config.getConfig("topmost") == 1);
|
||||
checkTopmost.CheckedChanged += CheckTopmost_CheckedChanged; ;
|
||||
|
||||
checkKeyboardAuto.Checked = (Program.config.getConfig("keyboard_auto") == 1);
|
||||
checkKeyboardAuto.CheckedChanged += CheckKeyboardAuto_CheckedChanged;
|
||||
|
||||
checkNoOverdrive.Checked = (Program.config.getConfig("no_overdrive") == 1);
|
||||
checkNoOverdrive.CheckedChanged += CheckNoOverdrive_CheckedChanged;
|
||||
|
||||
}
|
||||
|
||||
private void CheckNoOverdrive_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Program.config.setConfig("no_overdrive", (checkNoOverdrive.Checked ? 1 : 0));
|
||||
Program.settingsForm.AutoScreen(true);
|
||||
}
|
||||
|
||||
private void CheckKeyboardAuto_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Program.config.setConfig("keyboard_auto", (checkKeyboardAuto.Checked ? 1 : 0));
|
||||
|
||||
/*
|
||||
RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\ASUS\\ASUS System Control Interface\\AsusOptimization\\ASUS Keyboard Hotkeys", true);
|
||||
if (myKey != null)
|
||||
{
|
||||
myKey.SetValue("TurnOffKeybdLight", 30, RegistryValueKind.DWord);
|
||||
myKey.Close();
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
private void CheckTopmost_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Program.config.setConfig("topmost", (checkTopmost.Checked ? 1 : 0));
|
||||
Program.settingsForm.TopMost = checkTopmost.Checked;
|
||||
}
|
||||
|
||||
private void CheckPower_CheckedChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Program.config.setConfig("keyboard_awake", (checkAwake.Checked ? 1 : 0));
|
||||
Program.config.setConfig("keyboard_boot", (checkBoot.Checked ? 1 : 0));
|
||||
Program.config.setConfig("keyboard_sleep", (checkSleep.Checked ? 1 : 0));
|
||||
Program.config.setConfig("keyboard_shutdown", (checkShutdown.Checked ? 1 : 0));
|
||||
|
||||
Aura.ApplyAuraPower(checkAwake.Checked, checkBoot.Checked, checkSleep.Checked, checkShutdown.Checked);
|
||||
}
|
||||
|
||||
private void ComboKeyboardSpeed_SelectedValueChanged(object? sender, EventArgs e)
|
||||
{
|
||||
Program.config.setConfig("aura_speed", (int)comboKeyboardSpeed.SelectedValue);
|
||||
Program.settingsForm.SetAura();
|
||||
}
|
||||
|
||||
|
||||
private void Keyboard_Shown(object? sender, EventArgs e)
|
||||
{
|
||||
Top = Program.settingsForm.Top;
|
||||
Left = Program.settingsForm.Left - Width - 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
39
app/Logger.cs
Normal file
@@ -0,0 +1,39 @@
|
||||
using System.Diagnostics;
|
||||
|
||||
public static class Logger
|
||||
{
|
||||
static string appPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\GHelper";
|
||||
static string logFile = appPath + "\\log.txt";
|
||||
|
||||
public static void WriteLine(string logMessage)
|
||||
{
|
||||
Debug.WriteLine(logMessage);
|
||||
if (!Directory.Exists(appPath)) Directory.CreateDirectory(appPath);
|
||||
|
||||
try
|
||||
{
|
||||
using (StreamWriter w = File.AppendText(logFile))
|
||||
{
|
||||
w.WriteLine($"{DateTime.Now}: {logMessage}");
|
||||
w.Close();
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
if (new Random().Next(100) == 1) Cleanup();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void Cleanup()
|
||||
{
|
||||
try
|
||||
{
|
||||
var file = File.ReadAllLines(logFile);
|
||||
int skip = Math.Max(0, file.Count() - 500);
|
||||
File.WriteAllLines(logFile, file.Skip(skip).ToArray());
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
}
|
||||
749
app/NativeMethods.cs
Normal file
@@ -0,0 +1,749 @@
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Runtime.InteropServices;
|
||||
using static Tools.ScreenInterrogatory;
|
||||
|
||||
namespace Tools
|
||||
{
|
||||
|
||||
public class KeyHandler
|
||||
{
|
||||
|
||||
public const int NOMOD = 0x0000;
|
||||
public const int ALT = 0x0001;
|
||||
public const int CTRL = 0x0002;
|
||||
public const int SHIFT = 0x0004;
|
||||
public const int WIN = 0x0008;
|
||||
|
||||
public const int WM_HOTKEY_MSG_ID = 0x0312;
|
||||
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
||||
|
||||
private int modifier;
|
||||
private int key;
|
||||
private IntPtr hWnd;
|
||||
private int id;
|
||||
public KeyHandler(int modifier, Keys key, nint handle)
|
||||
{
|
||||
this.modifier = modifier;
|
||||
this.key = (int)key;
|
||||
this.hWnd = handle;
|
||||
id = this.GetHashCode();
|
||||
}
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return modifier ^ key ^ hWnd.ToInt32();
|
||||
}
|
||||
public bool Register()
|
||||
{
|
||||
return RegisterHotKey(hWnd, id, modifier, key);
|
||||
}
|
||||
public bool Unregiser()
|
||||
{
|
||||
return UnregisterHotKey(hWnd, id);
|
||||
}
|
||||
}
|
||||
|
||||
public static class ScreenInterrogatory
|
||||
{
|
||||
public const int ERROR_SUCCESS = 0;
|
||||
|
||||
#region enums
|
||||
|
||||
public enum QUERY_DEVICE_CONFIG_FLAGS : uint
|
||||
{
|
||||
QDC_ALL_PATHS = 0x00000001,
|
||||
QDC_ONLY_ACTIVE_PATHS = 0x00000002,
|
||||
QDC_DATABASE_CURRENT = 0x00000004
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY : uint
|
||||
{
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER = 0xFFFFFFFF,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15 = 0,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO = 1,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO = 2,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO = 3,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI = 4,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI = 5,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS = 6,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN = 8,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI = 9,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL = 10,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED = 11,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL = 12,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED = 13,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE = 14,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST = 15,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL = 0x80000000,
|
||||
DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_SCANLINE_ORDERING : uint
|
||||
{
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED = 0,
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE = 1,
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED = 2,
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST = 3,
|
||||
DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_ROTATION : uint
|
||||
{
|
||||
DISPLAYCONFIG_ROTATION_IDENTITY = 1,
|
||||
DISPLAYCONFIG_ROTATION_ROTATE90 = 2,
|
||||
DISPLAYCONFIG_ROTATION_ROTATE180 = 3,
|
||||
DISPLAYCONFIG_ROTATION_ROTATE270 = 4,
|
||||
DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_SCALING : uint
|
||||
{
|
||||
DISPLAYCONFIG_SCALING_IDENTITY = 1,
|
||||
DISPLAYCONFIG_SCALING_CENTERED = 2,
|
||||
DISPLAYCONFIG_SCALING_STRETCHED = 3,
|
||||
DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX = 4,
|
||||
DISPLAYCONFIG_SCALING_CUSTOM = 5,
|
||||
DISPLAYCONFIG_SCALING_PREFERRED = 128,
|
||||
DISPLAYCONFIG_SCALING_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_PIXELFORMAT : uint
|
||||
{
|
||||
DISPLAYCONFIG_PIXELFORMAT_8BPP = 1,
|
||||
DISPLAYCONFIG_PIXELFORMAT_16BPP = 2,
|
||||
DISPLAYCONFIG_PIXELFORMAT_24BPP = 3,
|
||||
DISPLAYCONFIG_PIXELFORMAT_32BPP = 4,
|
||||
DISPLAYCONFIG_PIXELFORMAT_NONGDI = 5,
|
||||
DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32 = 0xffffffff
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
|
||||
{
|
||||
DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
|
||||
DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
|
||||
DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
|
||||
{
|
||||
DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME = 1,
|
||||
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME = 2,
|
||||
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE = 3,
|
||||
DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME = 4,
|
||||
DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE = 5,
|
||||
DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE = 6,
|
||||
DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32 = 0xFFFFFFFF
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region structs
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct LUID
|
||||
{
|
||||
public uint LowPart;
|
||||
public int HighPart;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
|
||||
{
|
||||
public LUID adapterId;
|
||||
public uint id;
|
||||
public uint modeInfoIdx;
|
||||
public uint statusFlags;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_PATH_TARGET_INFO
|
||||
{
|
||||
public LUID adapterId;
|
||||
public uint id;
|
||||
public uint modeInfoIdx;
|
||||
private DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
|
||||
private DISPLAYCONFIG_ROTATION rotation;
|
||||
private DISPLAYCONFIG_SCALING scaling;
|
||||
private DISPLAYCONFIG_RATIONAL refreshRate;
|
||||
private DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
|
||||
public bool targetAvailable;
|
||||
public uint statusFlags;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_RATIONAL
|
||||
{
|
||||
public uint Numerator;
|
||||
public uint Denominator;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_PATH_INFO
|
||||
{
|
||||
public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
|
||||
public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
|
||||
public uint flags;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_2DREGION
|
||||
{
|
||||
public uint cx;
|
||||
public uint cy;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
|
||||
{
|
||||
public ulong pixelRate;
|
||||
public DISPLAYCONFIG_RATIONAL hSyncFreq;
|
||||
public DISPLAYCONFIG_RATIONAL vSyncFreq;
|
||||
public DISPLAYCONFIG_2DREGION activeSize;
|
||||
public DISPLAYCONFIG_2DREGION totalSize;
|
||||
public uint videoStandard;
|
||||
public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_TARGET_MODE
|
||||
{
|
||||
public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct POINTL
|
||||
{
|
||||
private int x;
|
||||
private int y;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_SOURCE_MODE
|
||||
{
|
||||
public uint width;
|
||||
public uint height;
|
||||
public DISPLAYCONFIG_PIXELFORMAT pixelFormat;
|
||||
public POINTL position;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
public struct DISPLAYCONFIG_MODE_INFO_UNION
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public DISPLAYCONFIG_TARGET_MODE targetMode;
|
||||
|
||||
[FieldOffset(0)]
|
||||
public DISPLAYCONFIG_SOURCE_MODE sourceMode;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_MODE_INFO
|
||||
{
|
||||
public DISPLAYCONFIG_MODE_INFO_TYPE infoType;
|
||||
public uint id;
|
||||
public LUID adapterId;
|
||||
public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
|
||||
{
|
||||
public uint value;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
|
||||
{
|
||||
public DISPLAYCONFIG_DEVICE_INFO_TYPE type;
|
||||
public uint size;
|
||||
public LUID adapterId;
|
||||
public uint id;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
|
||||
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
|
||||
{
|
||||
public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
|
||||
public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;
|
||||
public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
|
||||
public ushort edidManufactureId;
|
||||
public ushort edidProductCodeId;
|
||||
public uint connectorInstance;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
|
||||
public string monitorFriendlyDeviceName;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
|
||||
public string monitorDevicePath;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region DLL-Imports
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int GetDisplayConfigBufferSizes(
|
||||
QUERY_DEVICE_CONFIG_FLAGS flags, out uint numPathArrayElements, out uint numModeInfoArrayElements);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int QueryDisplayConfig(
|
||||
QUERY_DEVICE_CONFIG_FLAGS flags,
|
||||
ref uint numPathArrayElements, [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,
|
||||
ref uint numModeInfoArrayElements, [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,
|
||||
IntPtr currentTopologyId
|
||||
);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int DisplayConfigGetDeviceInfo(ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName);
|
||||
|
||||
#endregion
|
||||
|
||||
private static DISPLAYCONFIG_TARGET_DEVICE_NAME DeviceName(LUID adapterId, uint targetId)
|
||||
{
|
||||
var deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME
|
||||
{
|
||||
header =
|
||||
{
|
||||
size = (uint)Marshal.SizeOf(typeof (DISPLAYCONFIG_TARGET_DEVICE_NAME)),
|
||||
adapterId = adapterId,
|
||||
id = targetId,
|
||||
type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME
|
||||
}
|
||||
};
|
||||
var error = DisplayConfigGetDeviceInfo(ref deviceName);
|
||||
if (error != ERROR_SUCCESS)
|
||||
throw new Win32Exception(error);
|
||||
|
||||
return deviceName;
|
||||
}
|
||||
|
||||
public static IEnumerable<DISPLAYCONFIG_TARGET_DEVICE_NAME> GetAllDevices()
|
||||
{
|
||||
uint pathCount, modeCount;
|
||||
var error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS, out pathCount, out modeCount);
|
||||
if (error != ERROR_SUCCESS)
|
||||
throw new Win32Exception(error);
|
||||
|
||||
var displayPaths = new DISPLAYCONFIG_PATH_INFO[pathCount];
|
||||
var displayModes = new DISPLAYCONFIG_MODE_INFO[modeCount];
|
||||
error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
|
||||
ref pathCount, displayPaths, ref modeCount, displayModes, IntPtr.Zero);
|
||||
if (error != ERROR_SUCCESS)
|
||||
throw new Win32Exception(error);
|
||||
|
||||
for (var i = 0; i < modeCount; i++)
|
||||
if (displayModes[i].infoType == DISPLAYCONFIG_MODE_INFO_TYPE.DISPLAYCONFIG_MODE_INFO_TYPE_TARGET)
|
||||
yield return DeviceName(displayModes[i].adapterId, displayModes[i].id);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class NativeMethods
|
||||
{
|
||||
|
||||
// Monitor Power detection
|
||||
|
||||
internal const uint DEVICE_NOTIFY_WINDOW_HANDLE = 0x0;
|
||||
internal const uint DEVICE_NOTIFY_SERVICE_HANDLE = 0x1;
|
||||
internal const int WM_POWERBROADCAST = 0x0218;
|
||||
internal const int PBT_POWERSETTINGCHANGE = 0x8013;
|
||||
|
||||
[DllImport("User32.dll", SetLastError = true)]
|
||||
internal static extern IntPtr RegisterPowerSettingNotification(IntPtr hWnd, [In] Guid PowerSettingGuid, uint Flags);
|
||||
|
||||
[DllImport("User32.dll", SetLastError = true)]
|
||||
internal static extern bool UnregisterPowerSettingNotification(IntPtr hWnd);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 4)]
|
||||
internal struct POWERBROADCAST_SETTING
|
||||
{
|
||||
public Guid PowerSetting;
|
||||
public uint DataLength;
|
||||
public byte Data;
|
||||
}
|
||||
|
||||
public class PowerSettingGuid
|
||||
{
|
||||
// 0=Powered by AC, 1=Powered by Battery, 2=Powered by short-term source (UPC)
|
||||
public Guid AcdcPowerSource { get; } = new Guid("5d3e9a59-e9D5-4b00-a6bd-ff34ff516548");
|
||||
// POWERBROADCAST_SETTING.Data = 1-100
|
||||
public Guid BatteryPercentageRemaining { get; } = new Guid("a7ad8041-b45a-4cae-87a3-eecbb468a9e1");
|
||||
// Windows 8+: 0=Monitor Off, 1=Monitor On, 2=Monitor Dimmed
|
||||
public Guid ConsoleDisplayState { get; } = new Guid("6fe69556-704a-47a0-8f24-c28d936fda47");
|
||||
// Windows 8+, Session 0 enabled: 0=User providing Input, 2=User Idle
|
||||
public Guid GlobalUserPresence { get; } = new Guid("786E8A1D-B427-4344-9207-09E70BDCBEA9");
|
||||
// 0=Monitor Off, 1=Monitor On.
|
||||
public Guid MonitorPowerGuid { get; } = new Guid("02731015-4510-4526-99e6-e5a17ebd1aea");
|
||||
// 0=Battery Saver Off, 1=Battery Saver On.
|
||||
public Guid PowerSavingStatus { get; } = new Guid("E00958C0-C213-4ACE-AC77-FECCED2EEEA5");
|
||||
|
||||
// Windows 8+: 0=Off, 1=On, 2=Dimmed
|
||||
public Guid SessionDisplayStatus { get; } = new Guid("2B84C20E-AD23-4ddf-93DB-05FFBD7EFCA5");
|
||||
|
||||
// Windows 8+, no Session 0: 0=User providing Input, 2=User Idle
|
||||
public Guid SessionUserPresence { get; } = new Guid("3C0F4548-C03F-4c4d-B9F2-237EDE686376");
|
||||
// 0=Exiting away mode 1=Entering away mode
|
||||
public Guid SystemAwaymode { get; } = new Guid("98a7f580-01f7-48aa-9c0f-44352c29e5C0");
|
||||
|
||||
/* Windows 8+ */
|
||||
// POWERBROADCAST_SETTING.Data not used
|
||||
public Guid IdleBackgroundTask { get; } = new Guid(0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
|
||||
|
||||
public Guid PowerSchemePersonality { get; } = new Guid(0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
|
||||
|
||||
// The Following 3 Guids are the POWERBROADCAST_SETTING.Data result of PowerSchemePersonality
|
||||
public Guid MinPowerSavings { get; } = new Guid("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c");
|
||||
public Guid MaxPowerSavings { get; } = new Guid("a1841308-3541-4fab-bc81-f71556f20b4a");
|
||||
public Guid TypicalPowerSavings { get; } = new Guid("381b4222-f694-41f0-9685-ff5bb260df2e");
|
||||
}
|
||||
|
||||
|
||||
public const int KEYEVENTF_EXTENDEDKEY = 1;
|
||||
public const int KEYEVENTF_KEYUP = 2;
|
||||
|
||||
public const int VK_MEDIA_NEXT_TRACK = 0xB0;
|
||||
public const int VK_MEDIA_PLAY_PAUSE = 0xB3;
|
||||
public const int VK_MEDIA_PREV_TRACK = 0xB1;
|
||||
public const int VK_VOLUME_MUTE = 0xAD;
|
||||
public const int VK_SNAPSHOT = 0x2C;
|
||||
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
public static extern void keybd_event(byte virtualKey, byte scanCode, uint flags, IntPtr extraInfo);
|
||||
|
||||
public static void KeyPress(int key = VK_MEDIA_PLAY_PAUSE)
|
||||
{
|
||||
keybd_event((byte)key, 0, KEYEVENTF_EXTENDEDKEY, IntPtr.Zero);
|
||||
}
|
||||
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
|
||||
public const int SW_RESTORE = 9;
|
||||
|
||||
public static bool SwitchToCurrent()
|
||||
{
|
||||
IntPtr hWnd = IntPtr.Zero;
|
||||
Process process = Process.GetCurrentProcess();
|
||||
Process[] processes = Process.GetProcessesByName(process.ProcessName);
|
||||
foreach (Process _process in processes)
|
||||
{
|
||||
if (_process.Id != process.Id)
|
||||
{
|
||||
|
||||
if (_process.MainWindowHandle != IntPtr.Zero)
|
||||
{
|
||||
Debug.WriteLine(_process.Id);
|
||||
Debug.WriteLine(process.Id);
|
||||
|
||||
hWnd = _process.MainWindowHandle;
|
||||
ShowWindowAsync(hWnd, SW_RESTORE);
|
||||
}
|
||||
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerWriteDCValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
int AcValueIndex);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerWriteACValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
int AcValueIndex);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerReadACValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
out IntPtr AcValueIndex
|
||||
);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerReadDCValueIndex(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SubGroupOfPowerSettingsGuid,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid PowerSettingGuid,
|
||||
out IntPtr AcValueIndex
|
||||
);
|
||||
|
||||
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerSetActiveScheme(IntPtr RootPowerKey,
|
||||
[MarshalAs(UnmanagedType.LPStruct)] Guid SchemeGuid);
|
||||
|
||||
[DllImport("PowrProf.dll", CharSet = CharSet.Unicode)]
|
||||
static extern UInt32 PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid);
|
||||
|
||||
static readonly Guid GUID_CPU = new Guid("54533251-82be-4824-96c1-47b60b740d00");
|
||||
static readonly Guid GUID_BOOST = new Guid("be337238-0d82-4146-a960-4f3749d470c7");
|
||||
|
||||
[DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetActualOverlayScheme")]
|
||||
public static extern uint PowerGetActualOverlayScheme(out Guid ActualOverlayGuid);
|
||||
|
||||
[DllImportAttribute("powrprof.dll", EntryPoint = "PowerGetEffectiveOverlayScheme")]
|
||||
public static extern uint PowerGetEffectiveOverlayScheme(out Guid EffectiveOverlayGuid);
|
||||
|
||||
[DllImportAttribute("powrprof.dll", EntryPoint = "PowerSetActiveOverlayScheme")]
|
||||
public static extern uint PowerSetActiveOverlayScheme(Guid OverlaySchemeGuid);
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
|
||||
public struct DEVMODE
|
||||
{
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string dmDeviceName;
|
||||
|
||||
public short dmSpecVersion;
|
||||
public short dmDriverVersion;
|
||||
public short dmSize;
|
||||
public short dmDriverExtra;
|
||||
public int dmFields;
|
||||
public int dmPositionX;
|
||||
public int dmPositionY;
|
||||
public int dmDisplayOrientation;
|
||||
public int dmDisplayFixedOutput;
|
||||
public short dmColor;
|
||||
public short dmDuplex;
|
||||
public short dmYResolution;
|
||||
public short dmTTOption;
|
||||
public short dmCollate;
|
||||
|
||||
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
|
||||
public string dmFormName;
|
||||
|
||||
public short dmLogPixels;
|
||||
public short dmBitsPerPel;
|
||||
public int dmPelsWidth;
|
||||
public int dmPelsHeight;
|
||||
public int dmDisplayFlags;
|
||||
public int dmDisplayFrequency;
|
||||
public int dmICMMethod;
|
||||
public int dmICMIntent;
|
||||
public int dmMediaType;
|
||||
public int dmDitherType;
|
||||
public int dmReserved1;
|
||||
public int dmReserved2;
|
||||
public int dmPanningWidth;
|
||||
public int dmPanningHeight;
|
||||
};
|
||||
|
||||
[Flags()]
|
||||
public enum DisplaySettingsFlags : int
|
||||
{
|
||||
CDS_UPDATEREGISTRY = 1,
|
||||
CDS_TEST = 2,
|
||||
CDS_FULLSCREEN = 4,
|
||||
CDS_GLOBAL = 8,
|
||||
CDS_SET_PRIMARY = 0x10,
|
||||
CDS_RESET = 0x40000000,
|
||||
CDS_NORESET = 0x10000000
|
||||
}
|
||||
|
||||
// PInvoke declaration for EnumDisplaySettings Win32 API
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int EnumDisplaySettingsEx(
|
||||
string lpszDeviceName,
|
||||
int iModeNum,
|
||||
ref DEVMODE lpDevMode);
|
||||
|
||||
// PInvoke declaration for ChangeDisplaySettings Win32 API
|
||||
[DllImport("user32.dll")]
|
||||
public static extern int ChangeDisplaySettingsEx(
|
||||
string lpszDeviceName, ref DEVMODE lpDevMode, IntPtr hwnd,
|
||||
DisplaySettingsFlags dwflags, IntPtr lParam);
|
||||
|
||||
public static DEVMODE CreateDevmode()
|
||||
{
|
||||
DEVMODE dm = new DEVMODE();
|
||||
dm.dmDeviceName = new String(new char[32]);
|
||||
dm.dmFormName = new String(new char[32]);
|
||||
dm.dmSize = (short)Marshal.SizeOf(dm);
|
||||
return dm;
|
||||
}
|
||||
|
||||
public const int ENUM_CURRENT_SETTINGS = -1;
|
||||
public const string defaultDevice = "\\\\.\\DISPLAY1";
|
||||
|
||||
public static string FindLaptopScreen()
|
||||
{
|
||||
string laptopScreen = null;
|
||||
|
||||
try
|
||||
{
|
||||
var devices = GetAllDevices().ToArray();
|
||||
int count = 0, displayNum = -1;
|
||||
|
||||
foreach (var device in devices)
|
||||
{
|
||||
if (device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL ||
|
||||
device.outputTechnology == DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY.DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED)
|
||||
{
|
||||
displayNum = count;
|
||||
}
|
||||
count++;
|
||||
//Logger.WriteLine(device.outputTechnology.ToString());
|
||||
//Logger.WriteLine(device.monitorFriendlyDeviceName);
|
||||
}
|
||||
|
||||
var screens = Screen.AllScreens;
|
||||
|
||||
if (screens.Length != count) return null;
|
||||
|
||||
count = 0;
|
||||
foreach (var screen in screens)
|
||||
{
|
||||
if (count == displayNum)
|
||||
{
|
||||
laptopScreen = screen.DeviceName;
|
||||
}
|
||||
//Logger.WriteLine(screen.DeviceName);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.WriteLine(ex.ToString());
|
||||
Logger.WriteLine("Can't detect internal screen");
|
||||
//laptopScreen = Screen.PrimaryScreen.DeviceName;
|
||||
}
|
||||
|
||||
|
||||
return laptopScreen;
|
||||
}
|
||||
|
||||
public static int GetRefreshRate(bool max = false)
|
||||
{
|
||||
DEVMODE dm = CreateDevmode();
|
||||
|
||||
string laptopScreen = FindLaptopScreen();
|
||||
int frequency = -1;
|
||||
|
||||
if (laptopScreen is null)
|
||||
return -1;
|
||||
|
||||
if (max)
|
||||
{
|
||||
int i = 0;
|
||||
while (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, i, ref dm))
|
||||
{
|
||||
if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
|
||||
{
|
||||
frequency = dm.dmDisplayFrequency;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return frequency;
|
||||
}
|
||||
|
||||
public static int SetRefreshRate(int frequency = 120)
|
||||
{
|
||||
DEVMODE dm = CreateDevmode();
|
||||
string laptopScreen = FindLaptopScreen();
|
||||
|
||||
if (laptopScreen is null)
|
||||
return -1;
|
||||
|
||||
if (0 != NativeMethods.EnumDisplaySettingsEx(laptopScreen, NativeMethods.ENUM_CURRENT_SETTINGS, ref dm))
|
||||
{
|
||||
dm.dmDisplayFrequency = frequency;
|
||||
int iRet = NativeMethods.ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
||||
Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet));
|
||||
return iRet;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static Guid GetActiveScheme()
|
||||
{
|
||||
IntPtr pActiveSchemeGuid;
|
||||
var hr = PowerGetActiveScheme(IntPtr.Zero, out pActiveSchemeGuid);
|
||||
Guid activeSchemeGuid = (Guid)Marshal.PtrToStructure(pActiveSchemeGuid, typeof(Guid));
|
||||
return activeSchemeGuid;
|
||||
}
|
||||
|
||||
public static int GetCPUBoost()
|
||||
{
|
||||
IntPtr AcValueIndex;
|
||||
Guid activeSchemeGuid = GetActiveScheme();
|
||||
|
||||
UInt32 value = PowerReadACValueIndex(IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST, out AcValueIndex);
|
||||
|
||||
return AcValueIndex.ToInt32();
|
||||
|
||||
}
|
||||
|
||||
public static void SetCPUBoost(int boost = 0)
|
||||
{
|
||||
Guid activeSchemeGuid = GetActiveScheme();
|
||||
|
||||
var hrAC = PowerWriteACValueIndex(
|
||||
IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST,
|
||||
boost);
|
||||
|
||||
PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);
|
||||
|
||||
/*
|
||||
var hrDC = PowerWriteDCValueIndex(
|
||||
IntPtr.Zero,
|
||||
activeSchemeGuid,
|
||||
GUID_CPU,
|
||||
GUID_BOOST,
|
||||
boost);
|
||||
|
||||
PowerSetActiveScheme(IntPtr.Zero, activeSchemeGuid);
|
||||
*/
|
||||
|
||||
Logger.WriteLine("Boost " + boost);
|
||||
}
|
||||
|
||||
public static void SetPowerScheme(int mode)
|
||||
{
|
||||
switch (mode)
|
||||
{
|
||||
case 0: // balanced
|
||||
PowerSetActiveOverlayScheme(new Guid("00000000-0000-0000-0000-000000000000"));
|
||||
break;
|
||||
case 1: // turbo
|
||||
PowerSetActiveOverlayScheme(new Guid("ded574b5-45a0-4f42-8737-46345c09c238"));
|
||||
break;
|
||||
case 2: //silent
|
||||
PowerSetActiveOverlayScheme(new Guid("961cc777-2547-4f9d-8174-7d86181b8a7a"));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +1,7 @@
|
||||
using Microsoft.Win32;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
|
||||
public class HardwareMonitor
|
||||
{
|
||||
|
||||
public static float? cpuTemp = -1;
|
||||
public static float? batteryDischarge = -1;
|
||||
|
||||
|
||||
public static void ReadSensors()
|
||||
{
|
||||
cpuTemp = -1;
|
||||
batteryDischarge = -1;
|
||||
|
||||
try
|
||||
{
|
||||
var ct = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM", true);
|
||||
cpuTemp = ct.NextValue() - 273;
|
||||
ct.Dispose();
|
||||
|
||||
var cb = new PerformanceCounter("Power Meter", "Power", "Power Meter (0)", true);
|
||||
batteryDischarge = cb.NextValue() / 1000;
|
||||
cb.Dispose();
|
||||
}
|
||||
catch
|
||||
{
|
||||
Debug.WriteLine("Failed reading sensors");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
using Tools;
|
||||
|
||||
namespace GHelper
|
||||
{
|
||||
@@ -43,15 +14,30 @@ namespace GHelper
|
||||
Visible = true
|
||||
};
|
||||
|
||||
public static ASUSWmi wmi;
|
||||
public static ASUSWmi? wmi;
|
||||
public static AppConfig config = new AppConfig();
|
||||
|
||||
public static SettingsForm settingsForm = new SettingsForm();
|
||||
public static ToastForm toast = new ToastForm();
|
||||
|
||||
public static IntPtr unRegPowerNotify;
|
||||
|
||||
private static long lastAuto;
|
||||
private static long lastTheme;
|
||||
private static PowerLineStatus isPlugged = PowerLineStatus.Unknown;
|
||||
|
||||
// The main entry point for the application
|
||||
public static void Main()
|
||||
{
|
||||
|
||||
if (Process.GetProcesses().Count(p => p.ProcessName == "GHelper") > 1)
|
||||
{
|
||||
MessageBox.Show("G-Helper is already running. Check system tray for an icon.", "App already running", MessageBoxButtons.OK);
|
||||
Application.Exit();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
wmi = new ASUSWmi();
|
||||
@@ -69,47 +55,105 @@ namespace GHelper
|
||||
|
||||
}
|
||||
|
||||
Logger.WriteLine("------------");
|
||||
Logger.WriteLine("App launched: " + config.GetModel());
|
||||
|
||||
trayIcon.MouseClick += TrayIcon_MouseClick; ;
|
||||
Application.EnableVisualStyles();
|
||||
|
||||
var ds = settingsForm.Handle;
|
||||
|
||||
trayIcon.MouseClick += TrayIcon_MouseClick;
|
||||
|
||||
wmi.SubscribeToEvents(WatcherEventArrived);
|
||||
|
||||
settingsForm.InitGPUMode();
|
||||
settingsForm.InitBoost();
|
||||
settingsForm.InitAura();
|
||||
settingsForm.InitMatrix();
|
||||
|
||||
settingsForm.VisualiseGPUAuto(config.getConfig("gpu_auto"));
|
||||
settingsForm.VisualiseScreenAuto(config.getConfig("screen_auto"));
|
||||
settingsForm.SetStartupCheck(Startup.IsScheduled());
|
||||
|
||||
SetAutoModes();
|
||||
|
||||
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
||||
HardwareMonitor.RecreateGpuTemperatureProvider();
|
||||
|
||||
IntPtr ds = settingsForm.Handle;
|
||||
// Subscribing for system power change events
|
||||
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
|
||||
SystemEvents.UserPreferenceChanged += SystemEvents_UserPreferenceChanged;
|
||||
|
||||
// Subscribing for monitor power on events
|
||||
var settingGuid = new NativeMethods.PowerSettingGuid();
|
||||
unRegPowerNotify = NativeMethods.RegisterPowerSettingNotification(ds, settingGuid.ConsoleDisplayState, NativeMethods.DEVICE_NOTIFY_WINDOW_HANDLE);
|
||||
|
||||
// CTRL + SHIFT + F5 to cycle profiles
|
||||
var ghk = new KeyHandler(KeyHandler.SHIFT | KeyHandler.CTRL, Keys.F5, ds);
|
||||
ghk.Register();
|
||||
|
||||
if (Environment.CurrentDirectory.Trim('\\') == Application.StartupPath.Trim('\\'))
|
||||
{
|
||||
SettingsToggle();
|
||||
}
|
||||
|
||||
Application.Run();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private static void SetAutoModes()
|
||||
{
|
||||
PowerLineStatus isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
|
||||
|
||||
Debug.WriteLine(isPlugged.ToString());
|
||||
static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
|
||||
{
|
||||
|
||||
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastTheme) < 2000) return;
|
||||
|
||||
switch (e.Category)
|
||||
{
|
||||
case UserPreferenceCategory.General:
|
||||
bool changed = settingsForm.InitTheme();
|
||||
if (changed)
|
||||
{
|
||||
Debug.WriteLine("Theme Changed");
|
||||
lastTheme = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
}
|
||||
|
||||
if (settingsForm.fans is not null && settingsForm.fans.Text != "")
|
||||
settingsForm.fans.InitTheme();
|
||||
|
||||
if (settingsForm.keyb is not null && settingsForm.keyb.Text != "")
|
||||
settingsForm.keyb.InitTheme();
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static void SetAutoModes()
|
||||
{
|
||||
|
||||
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAuto) < 2000) return;
|
||||
lastAuto = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
|
||||
isPlugged = SystemInformation.PowerStatus.PowerLineStatus;
|
||||
Logger.WriteLine("AutoSetting for " + isPlugged.ToString());
|
||||
|
||||
settingsForm.SetBatteryChargeLimit(config.getConfig("charge_limit"));
|
||||
settingsForm.AutoPerformance(isPlugged);
|
||||
settingsForm.AutoScreen(isPlugged);
|
||||
settingsForm.AutoPerformance();
|
||||
|
||||
settingsForm.AutoGPUMode(isPlugged);
|
||||
settingsForm.SetMatrix(isPlugged);
|
||||
bool switched = settingsForm.AutoGPUMode();
|
||||
|
||||
if (!switched)
|
||||
{
|
||||
settingsForm.InitGPUMode();
|
||||
settingsForm.AutoScreen();
|
||||
}
|
||||
|
||||
settingsForm.AutoKeyboard();
|
||||
settingsForm.SetMatrix();
|
||||
}
|
||||
|
||||
private static void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
|
||||
{
|
||||
if (SystemInformation.PowerStatus.PowerLineStatus == isPlugged) return;
|
||||
|
||||
Logger.WriteLine("Windows - Power Mode Changed");
|
||||
SetAutoModes();
|
||||
}
|
||||
|
||||
@@ -126,7 +170,7 @@ namespace GHelper
|
||||
}
|
||||
catch
|
||||
{
|
||||
Debug.WriteLine("Failed to run " + fileName);
|
||||
Logger.WriteLine("Failed to run " + fileName);
|
||||
}
|
||||
|
||||
|
||||
@@ -203,7 +247,7 @@ namespace GHelper
|
||||
|
||||
int EventID = int.Parse(e.NewEvent["EventID"].ToString());
|
||||
|
||||
Debug.WriteLine(EventID);
|
||||
Logger.WriteLine("WMI event " + EventID);
|
||||
|
||||
switch (EventID)
|
||||
{
|
||||
@@ -251,6 +295,7 @@ namespace GHelper
|
||||
static void OnExit(object sender, EventArgs e)
|
||||
{
|
||||
trayIcon.Visible = false;
|
||||
NativeMethods.UnregisterPowerSettingNotification(unRegPowerNotify);
|
||||
Application.Exit();
|
||||
}
|
||||
}
|
||||
@@ -80,6 +80,26 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_balance_symbol_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-balance-symbol-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_bicycle_48__1_ {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-bicycle-48 (1)", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -90,6 +110,16 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_fan_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-fan-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -100,6 +130,36 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_fan_speed_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-fan-speed-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_fiat_500_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-fiat-500-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_game_controller_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-game-controller-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -120,6 +180,36 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_launch_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-launch-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_leaf_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-leaf-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_leaf_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-leaf-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -130,6 +220,86 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_organic_food_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-organic-food-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_organic_food_961 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-organic-food-961", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_processor_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-processor-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_project_management_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-project-management-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_project_management_48__1_ {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-project-management-48 (1)", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_rocket_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-rocket-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_spa_flower_48 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-spa-flower-48", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_spa_flower_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-spa-flower-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
@@ -160,6 +330,16 @@ namespace GHelper.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Bitmap.
|
||||
/// </summary>
|
||||
internal static System.Drawing.Bitmap icons8_xbox_controller_96 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("icons8-xbox-controller-96", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized resource of type System.Drawing.Icon similar to (Icon).
|
||||
/// </summary>
|
||||
@@ -118,40 +118,94 @@
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||
<data name="eco" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\eco.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="icons8-leaf-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-leaf-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-launch-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-launch-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-organic-food-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-organic-food-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-fiat-500-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-fiat-500-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-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-project-management-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-project-management-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-bicycle-48 (1)" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-bicycle-48 (1).png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<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-processor-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-processor-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-spa-flower-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-spa-flower-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-spa-flower-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-spa-flower-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="standard" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-keyboard-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-keyboard-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-fan-speed-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-fan-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="eco" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\eco.ico;System.Drawing.Icon, 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-rocket-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-rocket-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-organic-food-961" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-organic-food-961.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-balance-symbol-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-balance-symbol-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-fan-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-fan-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-matrix-desktop-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-matrix-desktop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-xbox-controller-96" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-xbox-controller-96.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-project-management-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-project-management-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-leaf-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-leaf-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="ultimate" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\ultimate.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="standard" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\standard.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="icons8-speed-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-speed-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="everything-is-fine-itsfine" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\everything-is-fine-itsfine.gif;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-matrix-desktop-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-matrix-desktop-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
<data name="icons8-game-controller-48" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\icons8-game-controller-48.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
7
app/Properties/launchSettings.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"profiles": {
|
||||
"GHelper": {
|
||||
"commandName": "Project"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 220 KiB After Width: | Height: | Size: 220 KiB |
BIN
app/Resources/icons8-balance-symbol-96.png
Normal file
|
After Width: | Height: | Size: 710 B |
BIN
app/Resources/icons8-bicycle-48 (1).png
Normal file
|
After Width: | Height: | Size: 924 B |
|
Before Width: | Height: | Size: 421 B After Width: | Height: | Size: 421 B |
BIN
app/Resources/icons8-fan-48.png
Normal file
|
After Width: | Height: | Size: 992 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
BIN
app/Resources/icons8-fan-speed-48.png
Normal file
|
After Width: | Height: | Size: 870 B |
BIN
app/Resources/icons8-fiat-500-48.png
Normal file
|
After Width: | Height: | Size: 784 B |
BIN
app/Resources/icons8-game-controller-48.png
Normal file
|
After Width: | Height: | Size: 611 B |
|
Before Width: | Height: | Size: 515 B After Width: | Height: | Size: 515 B |
|
Before Width: | Height: | Size: 260 B After Width: | Height: | Size: 260 B |
BIN
app/Resources/icons8-launch-96.png
Normal file
|
After Width: | Height: | Size: 648 B |
BIN
app/Resources/icons8-leaf-48.png
Normal file
|
After Width: | Height: | Size: 851 B |
BIN
app/Resources/icons8-leaf-96.png
Normal file
|
After Width: | Height: | Size: 910 B |
|
Before Width: | Height: | Size: 428 B After Width: | Height: | Size: 428 B |
BIN
app/Resources/icons8-organic-food-96.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
app/Resources/icons8-organic-food-961.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
app/Resources/icons8-processor-96.png
Normal file
|
After Width: | Height: | Size: 710 B |
BIN
app/Resources/icons8-project-management-48 (1).png
Normal file
|
After Width: | Height: | Size: 837 B |
BIN
app/Resources/icons8-project-management-48.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
app/Resources/icons8-rocket-48.png
Normal file
|
After Width: | Height: | Size: 763 B |
BIN
app/Resources/icons8-spa-flower-48.png
Normal file
|
After Width: | Height: | Size: 949 B |
BIN
app/Resources/icons8-spa-flower-96.png
Normal file
|
After Width: | Height: | Size: 954 B |
|
Before Width: | Height: | Size: 885 B After Width: | Height: | Size: 885 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 400 B After Width: | Height: | Size: 400 B |
BIN
app/Resources/icons8-xbox-controller-96.png
Normal file
|
After Width: | Height: | Size: 724 B |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.4 KiB |
966
Settings.Designer.cs → app/Settings.Designer.cs
generated
1359
app/Settings.cs
Normal file
168
app/Slider.cs
Normal file
@@ -0,0 +1,168 @@
|
||||
using System.Drawing.Drawing2D;
|
||||
|
||||
namespace WinFormsSliderBar
|
||||
{
|
||||
public static class GraphicsExtensions
|
||||
{
|
||||
public static void DrawCircle(this Graphics g, Pen pen,
|
||||
float centerX, float centerY, float radius)
|
||||
{
|
||||
g.DrawEllipse(pen, centerX - radius, centerY - radius,
|
||||
radius + radius, radius + radius);
|
||||
}
|
||||
|
||||
public static void FillCircle(this Graphics g, Brush brush,
|
||||
float centerX, float centerY, float radius)
|
||||
{
|
||||
g.FillEllipse(brush, centerX - radius, centerY - radius,
|
||||
radius + radius, radius + radius);
|
||||
}
|
||||
}
|
||||
|
||||
public class Slider : Control
|
||||
{
|
||||
private float _radius;
|
||||
private PointF _thumbPos;
|
||||
private SizeF _barSize;
|
||||
private PointF _barPos;
|
||||
|
||||
private int _step = 5;
|
||||
|
||||
public Color accentColor = Color.FromArgb(255, 58, 174, 239);
|
||||
public Color borderColor = Color.White;
|
||||
|
||||
public event EventHandler ValueChanged;
|
||||
|
||||
public Slider()
|
||||
{
|
||||
// This reduces flicker
|
||||
DoubleBuffered = true;
|
||||
}
|
||||
|
||||
private int _min = 0;
|
||||
public int Min
|
||||
{
|
||||
get => _min;
|
||||
set
|
||||
{
|
||||
_min = value;
|
||||
RecalculateParameters();
|
||||
}
|
||||
}
|
||||
|
||||
private int _max = 100;
|
||||
public int Max
|
||||
{
|
||||
get => _max;
|
||||
set
|
||||
{
|
||||
_max = value;
|
||||
RecalculateParameters();
|
||||
}
|
||||
}
|
||||
|
||||
private int _value = 50;
|
||||
public int Value
|
||||
{
|
||||
get => _value;
|
||||
set
|
||||
{
|
||||
|
||||
value = (int)Math.Round(value / (float)_step) * _step;
|
||||
|
||||
if (_value != value)
|
||||
{
|
||||
_value = value;
|
||||
ValueChanged?.Invoke(this, EventArgs.Empty);
|
||||
RecalculateParameters();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnPaint(PaintEventArgs e)
|
||||
{
|
||||
base.OnPaint(e);
|
||||
|
||||
Brush brushAccent = new SolidBrush(accentColor);
|
||||
Brush brushEmpty = new SolidBrush(Color.Gray);
|
||||
Brush brushBorder = new SolidBrush(borderColor);
|
||||
|
||||
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
|
||||
e.Graphics.FillRectangle(brushEmpty,
|
||||
_barPos.X, _barPos.Y, _barSize.Width, _barSize.Height);
|
||||
e.Graphics.FillRectangle(brushAccent,
|
||||
_barPos.X, _barPos.Y, _thumbPos.X - _barPos.X, _barSize.Height);
|
||||
|
||||
e.Graphics.FillCircle(brushBorder, _thumbPos.X, _thumbPos.Y, _radius);
|
||||
e.Graphics.FillCircle(brushAccent, _thumbPos.X, _thumbPos.Y, 0.7f * _radius);
|
||||
}
|
||||
|
||||
protected override void OnResize(EventArgs e)
|
||||
{
|
||||
base.OnResize(e);
|
||||
RecalculateParameters();
|
||||
}
|
||||
|
||||
private void RecalculateParameters()
|
||||
{
|
||||
_radius = 0.4F * ClientSize.Height;
|
||||
_barSize = new SizeF(ClientSize.Width - 4 * _radius, ClientSize.Height * 0.15F);
|
||||
_barPos = new PointF(_radius, (ClientSize.Height - _barSize.Height) / 2);
|
||||
_thumbPos = new PointF(
|
||||
_barSize.Width / (Max - Min) * (Value - Min) + _barPos.X,
|
||||
_barPos.Y + 0.5f * _barSize.Height);
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
bool _moving = false;
|
||||
SizeF _delta;
|
||||
|
||||
protected override void OnMouseDown(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseDown(e);
|
||||
|
||||
// Difference between tumb and mouse position.
|
||||
_delta = new SizeF(e.Location.X - _thumbPos.X, e.Location.Y - _thumbPos.Y);
|
||||
if (_delta.Width * _delta.Width + _delta.Height * _delta.Height <= _radius * _radius)
|
||||
{
|
||||
// Clicking inside thumb.
|
||||
_moving = true;
|
||||
}
|
||||
|
||||
_calculateValue(e);
|
||||
|
||||
}
|
||||
|
||||
private void _calculateValue(MouseEventArgs e)
|
||||
{
|
||||
float thumbX = e.Location.X; // - _delta.Width;
|
||||
if (thumbX < _barPos.X)
|
||||
{
|
||||
thumbX = _barPos.X;
|
||||
}
|
||||
else if (thumbX > _barPos.X + _barSize.Width)
|
||||
{
|
||||
thumbX = _barPos.X + _barSize.Width;
|
||||
}
|
||||
Value = (int)Math.Round(Min + (thumbX - _barPos.X) * (Max - Min) / _barSize.Width);
|
||||
|
||||
}
|
||||
|
||||
protected override void OnMouseMove(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseMove(e);
|
||||
if (_moving)
|
||||
{
|
||||
_calculateValue(e);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnMouseUp(MouseEventArgs e)
|
||||
{
|
||||
base.OnMouseUp(e);
|
||||
_moving = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
64
app/Startup.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using Microsoft.Win32.TaskScheduler;
|
||||
using System.Diagnostics;
|
||||
using System.Security.Principal;
|
||||
|
||||
public class Startup
|
||||
{
|
||||
|
||||
static string taskName = "GHelper";
|
||||
|
||||
public static bool IsScheduled()
|
||||
{
|
||||
TaskService taskService = new TaskService();
|
||||
return (taskService.RootFolder.AllTasks.Any(t => t.Name == taskName));
|
||||
}
|
||||
|
||||
public static void Schedule()
|
||||
{
|
||||
|
||||
string strExeFilePath = Application.ExecutablePath;
|
||||
|
||||
if (strExeFilePath is null) return;
|
||||
|
||||
var userId = WindowsIdentity.GetCurrent().Name;
|
||||
|
||||
using (TaskDefinition td = TaskService.Instance.NewTask())
|
||||
{
|
||||
td.RegistrationInfo.Description = "G-Helper Auto Start";
|
||||
td.Triggers.Add(new LogonTrigger { UserId = userId });
|
||||
td.Actions.Add(strExeFilePath);
|
||||
|
||||
td.Settings.StopIfGoingOnBatteries = false;
|
||||
td.Settings.DisallowStartIfOnBatteries = false;
|
||||
td.Settings.ExecutionTimeLimit = TimeSpan.Zero;
|
||||
|
||||
Debug.WriteLine(strExeFilePath);
|
||||
Debug.WriteLine(userId);
|
||||
|
||||
try
|
||||
{
|
||||
TaskService.Instance.RootFolder.RegisterTaskDefinition(taskName, td);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show("Can't create a start up task. Try running Task Scheduler by hand and manually deleting GHelper task if it exists there.", "Scheduler Error", MessageBoxButtons.OK);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static void UnSchedule()
|
||||
{
|
||||
using (TaskService taskService = new TaskService())
|
||||
{
|
||||
try
|
||||
{
|
||||
taskService.RootFolder.DeleteTask(taskName);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
MessageBox.Show("Can't remove task. Try running Task Scheduler by hand and manually deleting GHelper task if it exists there.", "Scheduler Error", MessageBoxButtons.OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -54,7 +54,8 @@
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<!--<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitor/dpiAwareness>-->
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2, PerMonitor, System</dpiAwareness>
|
||||
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">System</dpiAwareness>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
|
||||
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
BIN
app/old-ps1-script/ghelper.zip
Normal file
19
bloat.bat
Normal file
@@ -0,0 +1,19 @@
|
||||
sc config AsusAppService start= auto
|
||||
sc config ASUSLinkNear start= auto
|
||||
sc config ASUSLinkRemote start= auto
|
||||
sc config ASUSSoftwareManager start= auto
|
||||
sc config ASUSSwitch start= auto
|
||||
sc config ASUSSystemAnalysis start= auto
|
||||
sc config ASUSSystemDiagnosis start= auto
|
||||
sc config ArmouryCrateControlInterface start= auto
|
||||
|
||||
sc START AsusAppService
|
||||
sc START ASUSLinkNear
|
||||
sc START ASUSLinkRemote
|
||||
sc START ASUSSoftwareManager
|
||||
sc START ASUSSwitch
|
||||
sc START ASUSSystemAnalysis
|
||||
sc START ASUSSystemDiagnosis
|
||||
sc START ArmouryCrateControlInterface
|
||||
|
||||
set /p asd="Hit enter to finish"
|
||||
19
debloat.bat
Normal file
@@ -0,0 +1,19 @@
|
||||
sc STOP AsusAppService
|
||||
sc STOP ASUSLinkNear
|
||||
sc STOP ASUSLinkRemote
|
||||
sc STOP ASUSSoftwareManager
|
||||
sc STOP ASUSSwitch
|
||||
sc STOP ASUSSystemAnalysis
|
||||
sc STOP ASUSSystemDiagnosis
|
||||
sc STOP ArmouryCrateControlInterface
|
||||
|
||||
sc config AsusAppService start= disabled
|
||||
sc config ASUSLinkNear start= disabled
|
||||
sc config ASUSLinkRemote start= disabled
|
||||
sc config ASUSSoftwareManager start= disabled
|
||||
sc config ASUSSwitch start= disabled
|
||||
sc config ASUSSystemAnalysis start= disabled
|
||||
sc config ASUSSystemDiagnosis start= disabled
|
||||
sc config ArmouryCrateControlInterface start= disabled
|
||||
|
||||
set /p asd="Hit enter to finish"
|
||||
140
docs/README.md
Normal file
@@ -0,0 +1,140 @@
|
||||
# G-Helper (GHelper)
|
||||
|
||||
[](https://GitHub.com/seerge/g-helper/releases/) [](https://GitHub.com/seerge/g-helper/releases/) [](https://GitHub.com/seerge/g-helper/stargazers/)
|
||||
|
||||
## Lightweight Armoury Crate alternative for Asus laptops
|
||||
### Control tool for ROG Zephyrus G14, G15, Flow X13, Flow X16, TUF, Strix, Scar and other models
|
||||
|
||||
A small utility that allows you to do almost everything you could do with Armoury Crate but without extra bloat and unnecessary services.
|
||||
|
||||
## :gift: Main advantages
|
||||
|
||||
1. Seamless and automatic GPU switching (without asking you to close all apps, etc)
|
||||
2. All performance modes can be fully customized (with fan curves and PPTs)
|
||||
3. Very lightweight and consumes almost no resources, doesn't install any services. Just a single exe to run
|
||||
4. Simple and clean native UI with easy access to all settings
|
||||
5. Doesn't need administrator privileges to run!
|
||||
|
||||
## [:floppy_disk: Download App](https://github.com/seerge/g-helper/releases/latest/download/GHelper.zip)
|
||||
|
||||
If you like this app, please [star :star: it on Github](https://github.com/seerge/g-helper) and spread a word about it!
|
||||
|
||||
_If you post about the app - please include a link. Thanks._
|
||||
|
||||

|
||||
|
||||
### :zap: Main features
|
||||
|
||||
1. **Performance modes**: Silent - Balanced - Turbo (built-in, with default fan curves)
|
||||
2. **GPU modes**: Eco - Standard - Ultimate - Optimized
|
||||
3. Laptop screen refresh rate 60hz or 120hz (144hz, etc) with display overdrive (OD) and miniled multizone switch
|
||||
4. Custom fan curve editor, power limits (PPT) and turbo boost selection for every performance mode
|
||||
5. Anime matrix control thanks to [Starlight](https://github.com/vddCore/Starlight) + some tweaks from my side including animated GIFs
|
||||
6. Keyboard backlit animation and colors (including sleep animation and support for TUF models)
|
||||
7. Custom bindings for M3, M4 keys and FN+F5 (performance mode) FN+F4 (keyboard animation modes)
|
||||
8. Monitor CPU / GPU temperature, fan speeds and battery discharge rate
|
||||
9. Battery charge limit to preserve battery health
|
||||
|
||||
### :gear: Automatic switching when on battery or plugged in
|
||||
- Performance modes (app remembers last mode used on battery or when plugged)
|
||||
- Optimized GPU mode - disables dGPU on battery and enables when plugged
|
||||
- Auto Screen refresh rate (60hz on battery, 120+ hz when plugged)
|
||||
- Keyboard backlight can be turned off on battery
|
||||
|
||||
To keep auto switching and hotkeys working the app needs to stay running in the tray. It doesn't consume any resources.
|
||||
|
||||
### :rocket: Performance Modes
|
||||
|
||||
Modes are **same** as in Armoury Crate as they are stored in bios including default fan curves
|
||||
|
||||
1. Silent (minimal or no fans, 70W PPT total, up to 45W PPT to CPU) + Best power efficiency setting in windows
|
||||
2. Balanced (balanced fans, 100W PPT total, up to 45W PPT to CPU) + Balanced setting in windows
|
||||
3. Turbo (intense fans, 125W PPT total, up to 80W PPT to CPU) + Best performance setting in windows
|
||||
|
||||
_PPTs are shown for G14 2022, for other models PPTs will be different as they are set in bios._
|
||||
|
||||

|
||||
|
||||
### :video_game: GPU Modes
|
||||
|
||||
1. Eco mode : only low power integrated GPU enabled, iGPU drives built in display
|
||||
2. Standard mode (MS 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)
|
||||
4. Optimized: disables dGPU on battery (Eco) and enables when plugged (Standard)
|
||||
|
||||
## :question: FAQ
|
||||
|
||||
### How do I stop the Armory Crate install popup appearing every time I press the M4 / Rog key?
|
||||
Go to BIOS (F2 on boot), open Advanced Settings and disable "Armory Control Interface".
|
||||
If it still appears - delete or move somewhere following file ``C:\Windows\System32\ASUSACCI\ArmouryCrateKeyControl.exe``
|
||||
|
||||
### Why is Ultimate GPU mode not available on my laptop?
|
||||
Ultimate mode is supported (by hardware) only on G14 2022 (and possibly other models from 2022+)
|
||||
|
||||
### I can't set Eco mode (disable dGPU) on my G14 2020
|
||||
Unfortunately 2020 model doesn't support that on hardware level
|
||||
|
||||
### Should I apply custom PPTs and fan profiles?
|
||||
You don't have to, it's purely optional. From my experience built in (in bios) performance modes work well. Limit your power or apply custom fan curves only if you have issues. As soon as you click Apply in the fan + power section bios will be considering the fan profile as "custom"! (no matter if you modified it or not)
|
||||
|
||||
### How does G-helper control my fan speeds?
|
||||
It doesn't. Your bios does (same as in case with armoury). What G-helper can do - is (optionally) set a custom fan profile to current performance mode consisting of 8 pairs of temperature + fan speed % via same endpoint armoury seem to use.
|
||||
|
||||
### How do I change fan % to fan RPM?
|
||||
Click on them
|
||||
|
||||
### I don't see a GPU temperature in G-helper
|
||||
Most probably either you are using Eco / Optimized mode and your dGPU is simply off, or your windows has put the dGPU into sleep (to preserve power). In this situations G-helper won't be able to reach your GPU and get readings
|
||||
|
||||
### It says, that app is already running
|
||||
Please check system tray for a (G) icon. By default windows is keen to hide all icons, so you may need to click ^ to see them all. I would advise to right click on Task Bar select Task Bar Settings -> Other System Tray icons -> Mark G-Helper to be always ON.
|
||||
|
||||
### App doesn't start / or crashes, what should I do ?
|
||||
Open "Event Viewer" from start menu, go to Windows Logs -> Application and check for recent Errors mentioning G-Helper. If you see one - please post a [new issue](https://github.com/seerge/g-helper/issues) with all details from this error.
|
||||
|
||||
### Can I use MyASUS app along with G-Helper?
|
||||
Sure, you can! The only problem is that MyASUS may override the battery charge limit that you set before. My advice in such a situation would be to set the same limit (i.e. 80%) in both MyASUS and G-Helper.
|
||||
|
||||
### How do I uninstall G-helper?
|
||||
G-helper is a single exe, and it doesn't install anything in the system. To remove it - you can simply delete exe :) If you have applied any custom fan profiles or PPTs - before removing I would recommend selecting your favorite performance mode (for example balanced) and clicking "Factory defaults" under Fans + Power.
|
||||
|
||||
----------------------------
|
||||
|
||||
### How to install
|
||||
|
||||
1. Download latest release from [**Releases Page**](https://github.com/seerge/g-helper/releases)
|
||||
2. Unzip to a folder of your choice
|
||||
3. Run **GHelper.exe**
|
||||
|
||||
### Dependencies & Requirements
|
||||
|
||||
- Microsoft [.NET7](https://dotnet.microsoft.com/en-us/download). Most probably you already have it. Otherwise you can [download it](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-7.0.202-windows-x64-installer) from the official website.
|
||||
|
||||
- [Asus System Control Interface](https://dlcdnets.asus.com/pub/ASUS/nb/Image/CustomComponent/ASUSSystemControlInterfaceV3/ASUSSystemControlInterfaceV3.exe). If you have or had MyASUS app installed this "driver" probably still in place (even after MyASUS uninstalls). Alternatively - you can download and install it
|
||||
|
||||
- Optionally(!) you can disable / remove unnecessary services by running [this debloat bat file](https://raw.githubusercontent.com/seerge/g-helper/main/debloat.bat) as admin. To restore services - run [this bloat bat file](https://raw.githubusercontent.com/seerge/g-helper/main/bloat.bat) instead.
|
||||
|
||||
- I recommend keeping "Asus Optimization Service" running, as it keeps basic laptop hotkeys such as screen or keyboard brightness adjustment working.
|
||||
|
||||
- It's not recommended to use an app in combination with Armoury Crate services, because they adjust the same settings. You can [uninstall it using it's own uninstall tool](https://dlcdnets.asus.com/pub/ASUS/mb/14Utilities/Armoury_Crate_Uninstall_Tool.zip?model=armoury%20crate). Just in case, you can always install it back later.
|
||||
|
||||
-------------------------------
|
||||
|
||||
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.
|
||||
|
||||
I don't have a Microsoft certificate to sign the app yet, so if you get a warning from Windows Defender on launch (Windows Protected your PC), click More Info -> Run anyway. Alternatively you can compile and run project by yourself using Visual Studio :)
|
||||
|
||||
Settings file is stored at ``%AppData%\GHelper``
|
||||
|
||||
------------------
|
||||
|
||||
Debloating helps to save your battery and keep laptop a bit cooler
|
||||
|
||||

|
||||
|
||||
---------
|
||||
|
||||
**Disclaimers**
|
||||
"ROG", "TUF", and "Armoury Crate" are trademarked by and belong to AsusTek Computer, Inc. I make no claims to these or any assets belonging to AsusTek Computer and use them purely for informational purposes only.
|
||||
|
||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. MISUSE OF THIS SOFTWARE COULD CAUSE SYSTEM INSTABILITY OR MALFUNCTION.
|
||||
4
docs/_config.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
title: G-Helper
|
||||
description: Open source Armory Crate alternative for Asus ROG Zephyrus G14, G15, Flow X13, Flow X16, and other models
|
||||
plugins:
|
||||
- jemoji
|
||||
26
docs/_layouts/default.html
Normal file
@@ -0,0 +1,26 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ page.lang | default: site.lang | default: "en-US" }}">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
{% seo %}
|
||||
<link rel="stylesheet" href="{{ "/assets/css/style.css?v=" | append: site.github.build_revision | relative_url }}">
|
||||
{% include head-custom.html %}
|
||||
</head>
|
||||
<body>
|
||||
<div class="container-lg px-3 my-5 markdown-body">
|
||||
|
||||
{{ content }}
|
||||
|
||||
{% if site.github.private != true and site.github.license %}
|
||||
<div class="footer border-top border-gray-light mt-5 pt-3 text-right text-gray">
|
||||
This site is open source. {% github_edit_link "Improve this page" %}.
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/4.1.0/anchor.min.js" integrity="sha256-lZaRhKri35AyJSypXXs4o6OPFTbTmUoltBbDCbdzegg=" crossorigin="anonymous"></script>
|
||||
<script>anchors.add();</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
docs/screenshot-dark.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
docs/screenshot.png
Normal file
|
After Width: | Height: | Size: 4.2 MiB |
|
Before Width: | Height: | Size: 955 KiB After Width: | Height: | Size: 955 KiB |
@@ -1 +0,0 @@
|
||||
ps2exe .\ghelper.ps1 g14-helper.exe -title 'G14 Helper' -DPIAware -winFormsDPIAware -requireAdmin -iconFile 'standard.ico' -noConsole -copyright 'G14 Helper Tool' -noOutput
|
||||