mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
Cleanup
This commit is contained in:
@@ -8,21 +8,26 @@ using System.Timers;
|
|||||||
namespace GHelper.AnimeMatrix
|
namespace GHelper.AnimeMatrix
|
||||||
{
|
{
|
||||||
|
|
||||||
public class AniMatrix
|
public class AniMatrixControl
|
||||||
{
|
{
|
||||||
System.Timers.Timer matrixTimer = default!;
|
|
||||||
AnimeMatrixDevice mat;
|
|
||||||
|
|
||||||
double[] AudioValues;
|
SettingsForm settings;
|
||||||
WasapiCapture AudioDevice;
|
|
||||||
|
System.Timers.Timer matrixTimer = default!;
|
||||||
|
AnimeMatrixDevice? mat;
|
||||||
|
|
||||||
|
double[]? AudioValues;
|
||||||
|
WasapiCapture? AudioDevice;
|
||||||
|
|
||||||
public bool IsValid => mat != null;
|
public bool IsValid => mat != null;
|
||||||
|
|
||||||
private long lastPresent;
|
private long lastPresent;
|
||||||
private List<double> maxes = new List<double>();
|
private List<double> maxes = new List<double>();
|
||||||
|
|
||||||
public AniMatrix()
|
public AniMatrixControl(SettingsForm settingsForm)
|
||||||
{
|
{
|
||||||
|
settings = settingsForm;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mat = new AnimeMatrixDevice();
|
mat = new AnimeMatrixDevice();
|
||||||
@@ -251,12 +256,43 @@ namespace GHelper.AnimeMatrix
|
|||||||
if (maxes.Count > 20) maxes.RemoveAt(0);
|
if (maxes.Count > 20) maxes.RemoveAt(0);
|
||||||
maxAverage = maxes.Average();
|
maxAverage = maxes.Average();
|
||||||
|
|
||||||
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i]*20/maxAverage);
|
for (int i = 0; i < size; i++) DrawBar(20 - i, bars[i] * 20 / maxAverage);
|
||||||
|
|
||||||
mat.Present();
|
mat.Present();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void OpenMatrixPicture()
|
||||||
|
{
|
||||||
|
string fileName = null;
|
||||||
|
|
||||||
|
Thread t = new Thread(() =>
|
||||||
|
{
|
||||||
|
OpenFileDialog of = new OpenFileDialog();
|
||||||
|
of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF";
|
||||||
|
if (of.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
fileName = of.FileName;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
|
||||||
|
t.SetApartmentState(ApartmentState.STA);
|
||||||
|
t.Start();
|
||||||
|
t.Join();
|
||||||
|
|
||||||
|
if (fileName is not null)
|
||||||
|
{
|
||||||
|
AppConfig.Set("matrix_picture", fileName);
|
||||||
|
AppConfig.Set("matrix_running", 2);
|
||||||
|
|
||||||
|
SetMatrixPicture(fileName);
|
||||||
|
settings.SetMatrixRunning(2);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public void SetMatrixPicture(string fileName)
|
public void SetMatrixPicture(string fileName)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -68,6 +68,15 @@ public static class AppConfig
|
|||||||
|
|
||||||
return _model;
|
return _model;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string GetModelShort()
|
||||||
|
{
|
||||||
|
string model = GetModel();
|
||||||
|
int trim = model.LastIndexOf("_");
|
||||||
|
if (trim > 0) model = model.Substring(0, trim);
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
public static bool ContainsModel(string contains)
|
public static bool ContainsModel(string contains)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
130
app/AutoUpdate/AutoUpdateControl.cs
Normal file
130
app/AutoUpdate/AutoUpdateControl.cs
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace GHelper.AutoUpdate
|
||||||
|
{
|
||||||
|
public class AutoUpdateControl
|
||||||
|
{
|
||||||
|
|
||||||
|
SettingsForm settings;
|
||||||
|
|
||||||
|
public string versionUrl = "http://github.com/seerge/g-helper/releases";
|
||||||
|
static long lastUpdate;
|
||||||
|
|
||||||
|
public AutoUpdateControl(SettingsForm settingsForm)
|
||||||
|
{
|
||||||
|
settings = settingsForm;
|
||||||
|
settings.SetVersionLabel(Properties.Strings.VersionLabel + ": " + Assembly.GetExecutingAssembly().GetName().Version);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckForUpdates()
|
||||||
|
{
|
||||||
|
// Run update once per 12 hours
|
||||||
|
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return;
|
||||||
|
lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds();
|
||||||
|
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
await Task.Delay(TimeSpan.FromSeconds(1));
|
||||||
|
CheckForUpdatesAsync();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadReleases()
|
||||||
|
{
|
||||||
|
Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async void CheckForUpdatesAsync()
|
||||||
|
{
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
using (var httpClient = new HttpClient())
|
||||||
|
{
|
||||||
|
httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App");
|
||||||
|
var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest");
|
||||||
|
var config = JsonSerializer.Deserialize<JsonElement>(json);
|
||||||
|
var tag = config.GetProperty("tag_name").ToString().Replace("v", "");
|
||||||
|
var assets = config.GetProperty("assets");
|
||||||
|
|
||||||
|
string url = null;
|
||||||
|
|
||||||
|
for (int i = 0; i < assets.GetArrayLength(); i++)
|
||||||
|
{
|
||||||
|
if (assets[i].GetProperty("browser_download_url").ToString().Contains(".zip"))
|
||||||
|
url = assets[i].GetProperty("browser_download_url").ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url is null)
|
||||||
|
url = assets[0].GetProperty("browser_download_url").ToString();
|
||||||
|
|
||||||
|
var gitVersion = new Version(tag);
|
||||||
|
var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
||||||
|
//appVersion = new Version("0.50.0.0");
|
||||||
|
|
||||||
|
if (gitVersion.CompareTo(appVersion) > 0)
|
||||||
|
{
|
||||||
|
versionUrl = url;
|
||||||
|
settings.SetVersionLabel(Properties.Strings.DownloadUpdate + ": " + tag, true);
|
||||||
|
|
||||||
|
if (AppConfig.GetString("skip_version") != tag)
|
||||||
|
{
|
||||||
|
DialogResult dialogResult = MessageBox.Show(Properties.Strings.DownloadUpdate + ": G-Helper " + tag + "?", "Update", MessageBoxButtons.YesNo);
|
||||||
|
if (dialogResult == DialogResult.Yes)
|
||||||
|
AutoUpdate(url);
|
||||||
|
else
|
||||||
|
AppConfig.Set("skip_version", tag);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.WriteLine($"Latest version {appVersion}");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.WriteLine("Failed to check for updates:" + ex.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async void AutoUpdate(string requestUri)
|
||||||
|
{
|
||||||
|
|
||||||
|
Uri uri = new Uri(requestUri);
|
||||||
|
string zipName = Path.GetFileName(uri.LocalPath);
|
||||||
|
|
||||||
|
string exeLocation = Application.ExecutablePath;
|
||||||
|
string exeDir = Path.GetDirectoryName(exeLocation);
|
||||||
|
string zipLocation = exeDir + "\\" + zipName;
|
||||||
|
|
||||||
|
using (WebClient client = new WebClient())
|
||||||
|
{
|
||||||
|
client.DownloadFile(uri, zipLocation);
|
||||||
|
|
||||||
|
Logger.WriteLine(requestUri);
|
||||||
|
Logger.WriteLine(zipLocation);
|
||||||
|
Logger.WriteLine(exeLocation);
|
||||||
|
|
||||||
|
var cmd = new Process();
|
||||||
|
cmd.StartInfo.UseShellExecute = false;
|
||||||
|
cmd.StartInfo.CreateNoWindow = true;
|
||||||
|
cmd.StartInfo.FileName = "powershell";
|
||||||
|
cmd.StartInfo.Arguments = $"Start-Sleep -Seconds 1; Expand-Archive {zipLocation} -DestinationPath {exeDir} -Force; Remove-Item {zipLocation} -Force; {exeLocation}";
|
||||||
|
cmd.Start();
|
||||||
|
|
||||||
|
Application.Exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,7 +22,7 @@ namespace GHelper.Display
|
|||||||
public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1)
|
public void SetScreen(int frequency = -1, int overdrive = -1, int miniled = -1)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (NativeMethods.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate
|
if (ScreenNative.GetRefreshRate() < 0) // Laptop screen not detected or has unknown refresh rate
|
||||||
{
|
{
|
||||||
InitScreen();
|
InitScreen();
|
||||||
return;
|
return;
|
||||||
@@ -30,12 +30,12 @@ namespace GHelper.Display
|
|||||||
|
|
||||||
if (frequency >= 1000)
|
if (frequency >= 1000)
|
||||||
{
|
{
|
||||||
frequency = NativeMethods.GetRefreshRate(true);
|
frequency = ScreenNative.GetRefreshRate(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (frequency > 0)
|
if (frequency > 0)
|
||||||
{
|
{
|
||||||
NativeMethods.SetRefreshRate(frequency);
|
ScreenNative.SetRefreshRate(frequency);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overdrive >= 0)
|
if (overdrive >= 0)
|
||||||
@@ -64,8 +64,8 @@ namespace GHelper.Display
|
|||||||
|
|
||||||
public void InitScreen()
|
public void InitScreen()
|
||||||
{
|
{
|
||||||
int frequency = NativeMethods.GetRefreshRate();
|
int frequency = ScreenNative.GetRefreshRate();
|
||||||
int maxFrequency = NativeMethods.GetRefreshRate(true);
|
int maxFrequency = ScreenNative.GetRefreshRate(true);
|
||||||
|
|
||||||
bool screenAuto = AppConfig.Is("screen_auto");
|
bool screenAuto = AppConfig.Is("screen_auto");
|
||||||
bool overdriveSetting = !AppConfig.Is("no_overdrive");
|
bool overdriveSetting = !AppConfig.Is("no_overdrive");
|
||||||
|
|||||||
303
app/Display/ScreenInterrogatory.cs
Normal file
303
app/Display/ScreenInterrogatory.cs
Normal file
@@ -0,0 +1,303 @@
|
|||||||
|
using System.ComponentModel;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace GHelper.Display
|
||||||
|
{
|
||||||
|
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,
|
||||||
|
nint 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, nint.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
233
app/Display/ScreenNative.cs
Normal file
233
app/Display/ScreenNative.cs
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using static GHelper.Display.ScreenInterrogatory;
|
||||||
|
|
||||||
|
namespace GHelper.Display
|
||||||
|
{
|
||||||
|
internal class ScreenNative
|
||||||
|
{
|
||||||
|
[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 enum COLORPROFILETYPE
|
||||||
|
{
|
||||||
|
CPT_ICC,
|
||||||
|
CPT_DMP,
|
||||||
|
CPT_CAMP,
|
||||||
|
CPT_GMMP
|
||||||
|
}
|
||||||
|
public enum COLORPROFILESUBTYPE
|
||||||
|
{
|
||||||
|
CPST_PERCEPTUAL,
|
||||||
|
CPST_RELATIVE_COLORIMETRIC,
|
||||||
|
CPST_SATURATION,
|
||||||
|
CPST_ABSOLUTE_COLORIMETRIC,
|
||||||
|
CPST_NONE,
|
||||||
|
CPST_RGB_WORKING_SPACE,
|
||||||
|
CPST_CUSTOM_WORKING_SPACE,
|
||||||
|
CPST_STANDARD_DISPLAY_COLOR_MODE,
|
||||||
|
CPST_EXTENDED_DISPLAY_COLOR_MODE
|
||||||
|
}
|
||||||
|
public enum WCS_PROFILE_MANAGEMENT_SCOPE
|
||||||
|
{
|
||||||
|
WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE,
|
||||||
|
WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("mscms.dll", CharSet = CharSet.Unicode)]
|
||||||
|
public static extern bool WcsSetDefaultColorProfile(
|
||||||
|
WCS_PROFILE_MANAGEMENT_SCOPE scope,
|
||||||
|
string pDeviceName,
|
||||||
|
COLORPROFILETYPE cptColorProfileType,
|
||||||
|
COLORPROFILESUBTYPE cpstColorProfileSubType,
|
||||||
|
uint dwProfileID,
|
||||||
|
string pProfileName
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
string internalName = AppConfig.GetString("internal_display");
|
||||||
|
|
||||||
|
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 ||
|
||||||
|
device.monitorFriendlyDeviceName == internalName)
|
||||||
|
{
|
||||||
|
displayNum = count;
|
||||||
|
AppConfig.Set("internal_display", device.monitorFriendlyDeviceName);
|
||||||
|
}
|
||||||
|
count++;
|
||||||
|
//Logger.WriteLine(device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (displayNum > 0 && count == 0) laptopScreen = defaultDevice;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Logger.WriteLine(ex.ToString());
|
||||||
|
Logger.WriteLine("Can't detect internal screen");
|
||||||
|
laptopScreen = Screen.PrimaryScreen.DeviceName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 != EnumDisplaySettingsEx(laptopScreen, i, ref dm))
|
||||||
|
{
|
||||||
|
if (dm.dmDisplayFrequency > frequency) frequency = dm.dmDisplayFrequency;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (0 != EnumDisplaySettingsEx(laptopScreen, 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 != EnumDisplaySettingsEx(laptopScreen, ENUM_CURRENT_SETTINGS, ref dm))
|
||||||
|
{
|
||||||
|
dm.dmDisplayFrequency = frequency;
|
||||||
|
int iRet = ChangeDisplaySettingsEx(laptopScreen, ref dm, IntPtr.Zero, DisplaySettingsFlags.CDS_UPDATEREGISTRY, IntPtr.Zero);
|
||||||
|
Logger.WriteLine("Screen = " + frequency.ToString() + "Hz : " + (iRet == 0 ? "OK" : iRet));
|
||||||
|
|
||||||
|
//Fallback scenario
|
||||||
|
if (iRet != 0)
|
||||||
|
{
|
||||||
|
Thread.Sleep(300);
|
||||||
|
iRet = 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;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -577,7 +577,7 @@ namespace GHelper
|
|||||||
|
|
||||||
public void InitBoost()
|
public void InitBoost()
|
||||||
{
|
{
|
||||||
int boost = NativeMethods.GetCPUBoost();
|
int boost = PowerNative.GetCPUBoost();
|
||||||
if (boost >= 0)
|
if (boost >= 0)
|
||||||
comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1);
|
comboBoost.SelectedIndex = Math.Min(boost, comboBoost.Items.Count - 1);
|
||||||
}
|
}
|
||||||
@@ -586,7 +586,7 @@ namespace GHelper
|
|||||||
{
|
{
|
||||||
if (AppConfig.GetMode("auto_boost") != comboBoost.SelectedIndex)
|
if (AppConfig.GetMode("auto_boost") != comboBoost.SelectedIndex)
|
||||||
{
|
{
|
||||||
NativeMethods.SetCPUBoost(comboBoost.SelectedIndex);
|
PowerNative.SetCPUBoost(comboBoost.SelectedIndex);
|
||||||
}
|
}
|
||||||
AppConfig.SetMode("auto_boost", comboBoost.SelectedIndex);
|
AppConfig.SetMode("auto_boost", comboBoost.SelectedIndex);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
<ProduceReferenceAssembly>False</ProduceReferenceAssembly>
|
||||||
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
|
||||||
<AssemblyVersion>0.92</AssemblyVersion>
|
<AssemblyVersion>0.93</AssemblyVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||||
|
|||||||
@@ -7,9 +7,14 @@ namespace GHelper.Gpu
|
|||||||
{
|
{
|
||||||
public class GPUModeControl
|
public class GPUModeControl
|
||||||
{
|
{
|
||||||
static SettingsForm settings = Program.settingsForm;
|
SettingsForm settings;
|
||||||
ScreenControl screenControl = new ScreenControl();
|
ScreenControl screenControl = new ScreenControl();
|
||||||
|
|
||||||
|
public GPUModeControl(SettingsForm settingsForm)
|
||||||
|
{
|
||||||
|
settings = settingsForm;
|
||||||
|
}
|
||||||
|
|
||||||
public void InitGPUMode()
|
public void InitGPUMode()
|
||||||
{
|
{
|
||||||
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
|
int eco = Program.acpi.DeviceGet(AsusACPI.GPUEco);
|
||||||
|
|||||||
@@ -78,14 +78,14 @@ namespace GHelper.Mode
|
|||||||
if (AppConfig.Get("auto_apply_power_plan") != 0)
|
if (AppConfig.Get("auto_apply_power_plan") != 0)
|
||||||
{
|
{
|
||||||
if (AppConfig.GetModeString("scheme") is not null)
|
if (AppConfig.GetModeString("scheme") is not null)
|
||||||
NativeMethods.SetPowerScheme(AppConfig.GetModeString("scheme"));
|
PowerNative.SetPowerScheme(AppConfig.GetModeString("scheme"));
|
||||||
else
|
else
|
||||||
NativeMethods.SetPowerScheme(Modes.GetBase(mode));
|
PowerNative.SetPowerScheme(Modes.GetBase(mode));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AppConfig.GetMode("auto_boost") != -1)
|
if (AppConfig.GetMode("auto_boost") != -1)
|
||||||
{
|
{
|
||||||
NativeMethods.SetCPUBoost(AppConfig.GetMode("auto_boost"));
|
PowerNative.SetCPUBoost(AppConfig.GetMode("auto_boost"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
161
app/Mode/PowerNative.cs
Normal file
161
app/Mode/PowerNative.cs
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
namespace GHelper.Mode
|
||||||
|
{
|
||||||
|
internal class PowerNative
|
||||||
|
{
|
||||||
|
[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")]
|
||||||
|
static extern uint PowerReadACValue(
|
||||||
|
IntPtr RootPowerKey,
|
||||||
|
Guid SchemeGuid,
|
||||||
|
Guid SubGroupOfPowerSettingGuid,
|
||||||
|
Guid PowerSettingGuid,
|
||||||
|
ref int Type,
|
||||||
|
ref IntPtr Buffer,
|
||||||
|
ref uint BufferSize
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
[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");
|
||||||
|
|
||||||
|
private static Guid GUID_SLEEP_SUBGROUP = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20");
|
||||||
|
private static Guid GUID_HIBERNATEIDLE = new Guid("9d7815a6-7ee4-497e-8888-515a05f02364");
|
||||||
|
|
||||||
|
[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);
|
||||||
|
|
||||||
|
|
||||||
|
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();
|
||||||
|
|
||||||
|
if (boost == GetCPUBoost()) return;
|
||||||
|
|
||||||
|
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(string scheme)
|
||||||
|
{
|
||||||
|
List<string> overlays = new() {
|
||||||
|
"00000000-0000-0000-0000-000000000000",
|
||||||
|
"ded574b5-45a0-4f42-8737-46345c09c238",
|
||||||
|
"961cc777-2547-4f9d-8174-7d86181b8a7a",
|
||||||
|
"3af9B8d9-7c97-431d-ad78-34a8bfea439f"
|
||||||
|
};
|
||||||
|
|
||||||
|
if (overlays.Contains(scheme))
|
||||||
|
{
|
||||||
|
PowerSetActiveOverlayScheme(new Guid(scheme));
|
||||||
|
Logger.WriteLine("Power mode:" + scheme);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme));
|
||||||
|
Logger.WriteLine("Power plan:" + scheme);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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,310 +1,5 @@
|
|||||||
using System.ComponentModel;
|
using System.Runtime.InteropServices;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using static Tools.ScreenInterrogatory;
|
|
||||||
|
|
||||||
namespace Tools
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
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
|
public class NativeMethods
|
||||||
{
|
{
|
||||||
@@ -327,9 +22,6 @@ public class NativeMethods
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("User32.dll")]
|
|
||||||
public static extern bool SetForegroundWindow(IntPtr handle);
|
|
||||||
|
|
||||||
private const int WM_SYSCOMMAND = 0x0112;
|
private const int WM_SYSCOMMAND = 0x0112;
|
||||||
private const int SC_MONITORPOWER = 0xF170;
|
private const int SC_MONITORPOWER = 0xF170;
|
||||||
private const int MONITOR_OFF = 2;
|
private const int MONITOR_OFF = 2;
|
||||||
@@ -414,430 +106,5 @@ public class NativeMethods
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
[DllImport("Powrprof.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
|
|
||||||
public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent);
|
|
||||||
|
|
||||||
|
|
||||||
[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")]
|
|
||||||
static extern uint PowerReadACValue(
|
|
||||||
IntPtr RootPowerKey,
|
|
||||||
Guid SchemeGuid,
|
|
||||||
Guid SubGroupOfPowerSettingGuid,
|
|
||||||
Guid PowerSettingGuid,
|
|
||||||
ref int Type,
|
|
||||||
ref IntPtr Buffer,
|
|
||||||
ref uint BufferSize
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
[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");
|
|
||||||
|
|
||||||
private static Guid GUID_SLEEP_SUBGROUP = new Guid("238c9fa8-0aad-41ed-83f4-97be242c8f20");
|
|
||||||
private static Guid GUID_HIBERNATEIDLE = new Guid("9d7815a6-7ee4-497e-8888-515a05f02364");
|
|
||||||
|
|
||||||
[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 enum COLORPROFILETYPE
|
|
||||||
{
|
|
||||||
CPT_ICC,
|
|
||||||
CPT_DMP,
|
|
||||||
CPT_CAMP,
|
|
||||||
CPT_GMMP
|
|
||||||
}
|
|
||||||
public enum COLORPROFILESUBTYPE
|
|
||||||
{
|
|
||||||
CPST_PERCEPTUAL,
|
|
||||||
CPST_RELATIVE_COLORIMETRIC,
|
|
||||||
CPST_SATURATION,
|
|
||||||
CPST_ABSOLUTE_COLORIMETRIC,
|
|
||||||
CPST_NONE,
|
|
||||||
CPST_RGB_WORKING_SPACE,
|
|
||||||
CPST_CUSTOM_WORKING_SPACE,
|
|
||||||
CPST_STANDARD_DISPLAY_COLOR_MODE,
|
|
||||||
CPST_EXTENDED_DISPLAY_COLOR_MODE
|
|
||||||
}
|
|
||||||
public enum WCS_PROFILE_MANAGEMENT_SCOPE
|
|
||||||
{
|
|
||||||
WCS_PROFILE_MANAGEMENT_SCOPE_SYSTEM_WIDE,
|
|
||||||
WCS_PROFILE_MANAGEMENT_SCOPE_CURRENT_USER
|
|
||||||
}
|
|
||||||
|
|
||||||
[DllImport("mscms.dll", CharSet = CharSet.Unicode)]
|
|
||||||
public static extern bool WcsSetDefaultColorProfile(
|
|
||||||
WCS_PROFILE_MANAGEMENT_SCOPE scope,
|
|
||||||
string pDeviceName,
|
|
||||||
COLORPROFILETYPE cptColorProfileType,
|
|
||||||
COLORPROFILESUBTYPE cpstColorProfileSubType,
|
|
||||||
uint dwProfileID,
|
|
||||||
string pProfileName
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
string internalName = AppConfig.GetString("internal_display");
|
|
||||||
|
|
||||||
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 ||
|
|
||||||
device.monitorFriendlyDeviceName == internalName)
|
|
||||||
{
|
|
||||||
displayNum = count;
|
|
||||||
AppConfig.Set("internal_display", device.monitorFriendlyDeviceName);
|
|
||||||
}
|
|
||||||
count++;
|
|
||||||
//Logger.WriteLine(device.monitorFriendlyDeviceName + ":" + device.outputTechnology.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
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++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (displayNum > 0 && count == 0) laptopScreen = defaultDevice;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Logger.WriteLine(ex.ToString());
|
|
||||||
Logger.WriteLine("Can't detect internal screen");
|
|
||||||
laptopScreen = Screen.PrimaryScreen.DeviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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));
|
|
||||||
|
|
||||||
//Fallback scenario
|
|
||||||
if (iRet != 0)
|
|
||||||
{
|
|
||||||
Thread.Sleep(300);
|
|
||||||
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;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static nint GetHuibernateAfter()
|
|
||||||
{
|
|
||||||
Guid activePolicyGuid = GetActiveScheme();
|
|
||||||
var type = 0;
|
|
||||||
nint value = 0;
|
|
||||||
var valueSize = 4u;
|
|
||||||
|
|
||||||
PowerReadACValue(IntPtr.Zero, activePolicyGuid,
|
|
||||||
GUID_SLEEP_SUBGROUP, GUID_HIBERNATEIDLE,
|
|
||||||
ref type, ref value, ref valueSize);
|
|
||||||
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
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();
|
|
||||||
|
|
||||||
if (boost == GetCPUBoost()) return;
|
|
||||||
|
|
||||||
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(string scheme)
|
|
||||||
{
|
|
||||||
List<string> overlays = new() {
|
|
||||||
"00000000-0000-0000-0000-000000000000",
|
|
||||||
"ded574b5-45a0-4f42-8737-46345c09c238",
|
|
||||||
"961cc777-2547-4f9d-8174-7d86181b8a7a",
|
|
||||||
"3af9B8d9-7c97-431d-ad78-34a8bfea439f"
|
|
||||||
};
|
|
||||||
|
|
||||||
if (overlays.Contains(scheme))
|
|
||||||
{
|
|
||||||
PowerSetActiveOverlayScheme(new Guid(scheme));
|
|
||||||
Logger.WriteLine("Power mode:" + scheme);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PowerSetActiveScheme(IntPtr.Zero, new Guid(scheme));
|
|
||||||
Logger.WriteLine("Power plan:" + scheme);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using System.Diagnostics;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using static NativeMethods;
|
using static NativeMethods;
|
||||||
|
using GHelper.AutoUpdate;
|
||||||
|
|
||||||
namespace GHelper
|
namespace GHelper
|
||||||
{
|
{
|
||||||
@@ -27,7 +28,7 @@ namespace GHelper
|
|||||||
public static SettingsForm settingsForm = new SettingsForm();
|
public static SettingsForm settingsForm = new SettingsForm();
|
||||||
|
|
||||||
public static ModeControl modeControl = new ModeControl();
|
public static ModeControl modeControl = new ModeControl();
|
||||||
static GPUModeControl gpuControl = new GPUModeControl();
|
static GPUModeControl gpuControl = new GPUModeControl(settingsForm);
|
||||||
static ScreenControl screenControl = new ScreenControl();
|
static ScreenControl screenControl = new ScreenControl();
|
||||||
|
|
||||||
public static ToastForm toast = new ToastForm();
|
public static ToastForm toast = new ToastForm();
|
||||||
|
|||||||
200
app/Settings.cs
200
app/Settings.cs
@@ -1,14 +1,12 @@
|
|||||||
using GHelper.AnimeMatrix;
|
using GHelper.AnimeMatrix;
|
||||||
|
using GHelper.AutoUpdate;
|
||||||
|
using GHelper.Display;
|
||||||
using GHelper.Gpu;
|
using GHelper.Gpu;
|
||||||
using GHelper.Helpers;
|
using GHelper.Helpers;
|
||||||
using GHelper.Input;
|
using GHelper.Input;
|
||||||
using GHelper.Mode;
|
using GHelper.Mode;
|
||||||
using GHelper.Display;
|
|
||||||
using GHelper.UI;
|
using GHelper.UI;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Net;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
|
|
||||||
namespace GHelper
|
namespace GHelper
|
||||||
@@ -20,18 +18,18 @@ namespace GHelper
|
|||||||
ContextMenuStrip contextMenuStrip = new CustomContextMenu();
|
ContextMenuStrip contextMenuStrip = new CustomContextMenu();
|
||||||
ToolStripMenuItem menuSilent, menuBalanced, menuTurbo, menuEco, menuStandard, menuUltimate, menuOptimized;
|
ToolStripMenuItem menuSilent, menuBalanced, menuTurbo, menuEco, menuStandard, menuUltimate, menuOptimized;
|
||||||
|
|
||||||
GPUModeControl gpuControl = new GPUModeControl();
|
GPUModeControl gpuControl;
|
||||||
ScreenControl screenControl = new ScreenControl();
|
ScreenControl screenControl = new ScreenControl();
|
||||||
|
AutoUpdateControl updateControl;
|
||||||
|
|
||||||
public static System.Timers.Timer aTimer = default!;
|
public AniMatrixControl matrix;
|
||||||
public string versionUrl = "http://github.com/seerge/g-helper/releases";
|
|
||||||
|
|
||||||
public AniMatrix matrix;
|
public static System.Timers.Timer sensorTimer = default!;
|
||||||
public Fans fans;
|
|
||||||
public Extra keyb;
|
public Fans? fans;
|
||||||
public Updates updates;
|
public Extra? keyb;
|
||||||
|
public Updates? updates;
|
||||||
|
|
||||||
static long lastUpdate;
|
|
||||||
static long lastRefresh;
|
static long lastRefresh;
|
||||||
|
|
||||||
bool isGpuSection = true;
|
bool isGpuSection = true;
|
||||||
@@ -42,6 +40,10 @@ namespace GHelper
|
|||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
InitTheme(true);
|
InitTheme(true);
|
||||||
|
|
||||||
|
gpuControl = new GPUModeControl(this);
|
||||||
|
updateControl = new AutoUpdateControl(this);
|
||||||
|
matrix = new AniMatrixControl(this);
|
||||||
|
|
||||||
buttonSilent.Text = Properties.Strings.Silent;
|
buttonSilent.Text = Properties.Strings.Silent;
|
||||||
buttonBalanced.Text = Properties.Strings.Balanced;
|
buttonBalanced.Text = Properties.Strings.Balanced;
|
||||||
buttonTurbo.Text = Properties.Strings.Turbo;
|
buttonTurbo.Text = Properties.Strings.Turbo;
|
||||||
@@ -166,18 +168,11 @@ namespace GHelper
|
|||||||
sliderBattery.ValueChanged += SliderBattery_ValueChanged;
|
sliderBattery.ValueChanged += SliderBattery_ValueChanged;
|
||||||
Program.trayIcon.MouseMove += TrayIcon_MouseMove;
|
Program.trayIcon.MouseMove += TrayIcon_MouseMove;
|
||||||
|
|
||||||
aTimer = new System.Timers.Timer(1000);
|
sensorTimer = new System.Timers.Timer(1000);
|
||||||
aTimer.Elapsed += OnTimedEvent;
|
sensorTimer.Elapsed += OnTimedEvent;
|
||||||
aTimer.Enabled = true;
|
sensorTimer.Enabled = true;
|
||||||
|
|
||||||
SetVersionLabel(Properties.Strings.VersionLabel + ": " + Assembly.GetExecutingAssembly().GetName().Version);
|
|
||||||
|
|
||||||
string model = AppConfig.GetModel();
|
|
||||||
int trim = model.LastIndexOf("_");
|
|
||||||
if (trim > 0) model = model.Substring(0, trim);
|
|
||||||
|
|
||||||
labelModel.Text = model + (ProcessHelper.IsUserAdministrator() ? "." : "");
|
|
||||||
|
|
||||||
|
labelModel.Text = AppConfig.GetModelShort() + (ProcessHelper.IsUserAdministrator() ? "." : "");
|
||||||
TopMost = AppConfig.Is("topmost");
|
TopMost = AppConfig.Is("topmost");
|
||||||
|
|
||||||
SetContextMenu();
|
SetContextMenu();
|
||||||
@@ -186,22 +181,12 @@ namespace GHelper
|
|||||||
|
|
||||||
private void SettingsForm_VisibleChanged(object? sender, EventArgs e)
|
private void SettingsForm_VisibleChanged(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
aTimer.Enabled = this.Visible;
|
sensorTimer.Enabled = this.Visible;
|
||||||
if (this.Visible)
|
if (this.Visible)
|
||||||
{
|
{
|
||||||
screenControl.InitScreen();
|
screenControl.InitScreen();
|
||||||
gpuControl.InitXGM();
|
gpuControl.InitXGM();
|
||||||
|
updateControl.CheckForUpdates();
|
||||||
// Run update once per 12 hours
|
|
||||||
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeSeconds() - lastUpdate) < 43200) return;
|
|
||||||
lastUpdate = DateTimeOffset.Now.ToUnixTimeSeconds();
|
|
||||||
|
|
||||||
Task.Run(async () =>
|
|
||||||
{
|
|
||||||
await Task.Delay(TimeSpan.FromSeconds(1));
|
|
||||||
CheckForUpdatesAsync();
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -350,111 +335,19 @@ namespace GHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async void CheckForUpdatesAsync()
|
public void SetVersionLabel(string label, bool update = false)
|
||||||
{
|
{
|
||||||
|
Invoke(delegate
|
||||||
try
|
|
||||||
{
|
|
||||||
|
|
||||||
using (var httpClient = new HttpClient())
|
|
||||||
{
|
|
||||||
httpClient.DefaultRequestHeaders.Add("User-Agent", "C# App");
|
|
||||||
var json = await httpClient.GetStringAsync("https://api.github.com/repos/seerge/g-helper/releases/latest");
|
|
||||||
var config = JsonSerializer.Deserialize<JsonElement>(json);
|
|
||||||
var tag = config.GetProperty("tag_name").ToString().Replace("v", "");
|
|
||||||
var assets = config.GetProperty("assets");
|
|
||||||
|
|
||||||
string url = null;
|
|
||||||
|
|
||||||
for (int i = 0; i < assets.GetArrayLength(); i++)
|
|
||||||
{
|
|
||||||
if (assets[i].GetProperty("browser_download_url").ToString().Contains(".zip"))
|
|
||||||
url = assets[i].GetProperty("browser_download_url").ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (url is null)
|
|
||||||
url = assets[0].GetProperty("browser_download_url").ToString();
|
|
||||||
|
|
||||||
var gitVersion = new Version(tag);
|
|
||||||
var appVersion = new Version(Assembly.GetExecutingAssembly().GetName().Version.ToString());
|
|
||||||
//appVersion = new Version("0.50.0.0");
|
|
||||||
|
|
||||||
if (gitVersion.CompareTo(appVersion) > 0)
|
|
||||||
{
|
|
||||||
SetVersionLabel(Properties.Strings.DownloadUpdate + ": " + tag, url);
|
|
||||||
if (AppConfig.GetString("skip_version") != tag)
|
|
||||||
{
|
|
||||||
DialogResult dialogResult = MessageBox.Show(Properties.Strings.DownloadUpdate + ": G-Helper " + tag + "?", "Update", MessageBoxButtons.YesNo);
|
|
||||||
if (dialogResult == DialogResult.Yes)
|
|
||||||
AutoUpdate(url);
|
|
||||||
else
|
|
||||||
AppConfig.Set("skip_version", tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.WriteLine("Latest version");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.WriteLine("Failed to check for updates:" + ex.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetVersionLabel(string label, string url = null)
|
|
||||||
{
|
|
||||||
BeginInvoke(delegate
|
|
||||||
{
|
{
|
||||||
labelVersion.Text = label;
|
labelVersion.Text = label;
|
||||||
if (url is not null)
|
if (update) labelVersion.ForeColor = colorTurbo;
|
||||||
{
|
|
||||||
this.versionUrl = url;
|
|
||||||
labelVersion.ForeColor = Color.Red;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public async void AutoUpdate(string requestUri)
|
|
||||||
{
|
|
||||||
|
|
||||||
Uri uri = new Uri(requestUri);
|
|
||||||
string zipName = Path.GetFileName(uri.LocalPath);
|
|
||||||
|
|
||||||
string exeLocation = Application.ExecutablePath;
|
|
||||||
string exeDir = Path.GetDirectoryName(exeLocation);
|
|
||||||
string zipLocation = exeDir + "\\" + zipName;
|
|
||||||
|
|
||||||
using (WebClient client = new WebClient())
|
|
||||||
{
|
|
||||||
client.DownloadFile(uri, zipLocation);
|
|
||||||
|
|
||||||
Logger.WriteLine(requestUri);
|
|
||||||
Logger.WriteLine(zipLocation);
|
|
||||||
Logger.WriteLine(exeLocation);
|
|
||||||
|
|
||||||
var cmd = new Process();
|
|
||||||
cmd.StartInfo.UseShellExecute = false;
|
|
||||||
cmd.StartInfo.CreateNoWindow = true;
|
|
||||||
cmd.StartInfo.FileName = "powershell";
|
|
||||||
cmd.StartInfo.Arguments = $"Start-Sleep -Seconds 1; Expand-Archive {zipLocation} -DestinationPath {exeDir} -Force; Remove-Item {zipLocation} -Force; {exeLocation}";
|
|
||||||
cmd.Start();
|
|
||||||
|
|
||||||
Application.Exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void LabelVersion_Click(object? sender, EventArgs e)
|
private void LabelVersion_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Process.Start(new ProcessStartInfo(versionUrl) { UseShellExecute = true });
|
updateControl.LoadReleases();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void TrayIcon_MouseMove(object? sender, MouseEventArgs e)
|
private static void TrayIcon_MouseMove(object? sender, MouseEventArgs e)
|
||||||
@@ -553,59 +446,36 @@ namespace GHelper
|
|||||||
|
|
||||||
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
|
private void CheckMatrix_CheckedChanged(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (sender is null) return;
|
AppConfig.Set("matrix_auto", checkMatrix.Checked ? 1 : 0);
|
||||||
CheckBox check = (CheckBox)sender;
|
matrix.SetMatrix();
|
||||||
AppConfig.Set("matrix_auto", check.Checked ? 1 : 0);
|
|
||||||
matrix?.SetMatrix();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void ButtonMatrix_Click(object? sender, EventArgs e)
|
private void ButtonMatrix_Click(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
string fileName = null;
|
matrix.OpenMatrixPicture();
|
||||||
|
}
|
||||||
|
|
||||||
Thread t = new Thread(() =>
|
public void SetMatrixRunning(int mode)
|
||||||
|
{
|
||||||
|
Invoke(delegate
|
||||||
{
|
{
|
||||||
OpenFileDialog of = new OpenFileDialog();
|
comboMatrixRunning.SelectedIndex = mode;
|
||||||
of.Filter = "Image Files (*.bmp;*.jpg;*.jpeg,*.png,*.gif)|*.BMP;*.JPG;*.JPEG;*.PNG;*.GIF";
|
|
||||||
if (of.ShowDialog() == DialogResult.OK)
|
|
||||||
{
|
|
||||||
fileName = of.FileName;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
t.SetApartmentState(ApartmentState.STA);
|
|
||||||
t.Start();
|
|
||||||
t.Join();
|
|
||||||
|
|
||||||
if (fileName is not null)
|
|
||||||
{
|
|
||||||
AppConfig.Set("matrix_picture", fileName);
|
|
||||||
AppConfig.Set("matrix_running", 2);
|
|
||||||
|
|
||||||
matrix?.SetMatrixPicture(fileName);
|
|
||||||
BeginInvoke(delegate
|
|
||||||
{
|
|
||||||
comboMatrixRunning.SelectedIndex = 2;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
|
private void ComboMatrixRunning_SelectedValueChanged(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex);
|
AppConfig.Set("matrix_running", comboMatrixRunning.SelectedIndex);
|
||||||
matrix?.SetMatrix();
|
matrix.SetMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
|
private void ComboMatrix_SelectedValueChanged(object? sender, EventArgs e)
|
||||||
{
|
{
|
||||||
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
|
AppConfig.Set("matrix_brightness", comboMatrix.SelectedIndex);
|
||||||
matrix?.SetMatrix();
|
matrix.SetMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -727,8 +597,6 @@ namespace GHelper
|
|||||||
public void InitMatrix()
|
public void InitMatrix()
|
||||||
{
|
{
|
||||||
|
|
||||||
matrix = new AniMatrix();
|
|
||||||
|
|
||||||
if (!matrix.IsValid)
|
if (!matrix.IsValid)
|
||||||
{
|
{
|
||||||
panelMatrix.Visible = false;
|
panelMatrix.Visible = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user