mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
168 lines
6.1 KiB
C#
168 lines
6.1 KiB
C#
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"
|
|
};
|
|
|
|
Guid guidScheme = new Guid(scheme);
|
|
|
|
if (overlays.Contains(scheme))
|
|
{
|
|
uint status = PowerGetEffectiveOverlayScheme(out Guid activeScheme);
|
|
if (status != 0 || activeScheme != guidScheme)
|
|
{
|
|
PowerSetActiveOverlayScheme(guidScheme);
|
|
Logger.WriteLine("Power mode: " + scheme);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PowerSetActiveScheme(IntPtr.Zero, guidScheme);
|
|
Logger.WriteLine("Power plan: " + scheme);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
public static void SetPowerScheme(int mode)
|
|
{
|
|
switch (mode)
|
|
{
|
|
case 0: // balanced
|
|
SetPowerScheme("00000000-0000-0000-0000-000000000000");
|
|
break;
|
|
case 1: // turbo
|
|
SetPowerScheme("ded574b5-45a0-4f42-8737-46345c09c238");
|
|
break;
|
|
case 2: //silent
|
|
SetPowerScheme("961cc777-2547-4f9d-8174-7d86181b8a7a");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|