ProjectArcade
165 строк · 5.9 Кб
1using System;2using System.Collections.Generic;3using System.Linq;4using System.Text;5using System.Runtime.InteropServices;6
7namespace EmulatorLauncher.Common8{
9public class HighPerformancePowerScheme : IDisposable10{11PowerScheme _oldPowerSheme;12
13public HighPerformancePowerScheme()14{15try16{17var powerSchemes = HighPerformancePowerScheme.GetPowerSchemes();18
19var oldPowerScheme = powerSchemes.FirstOrDefault(s => s.IsActive);20var newPowerScheme = powerSchemes.FirstOrDefault(s => s.Guid == new Guid("8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"));21
22if (newPowerScheme != null && oldPowerScheme != null && oldPowerScheme != newPowerScheme)23{24SetActivePowerScheme(newPowerScheme.Guid);25_oldPowerSheme = oldPowerScheme;26}27}28catch { }29}30
31public void Dispose()32{33if (_oldPowerSheme != null)34{35SetActivePowerScheme(_oldPowerSheme.Guid);36_oldPowerSheme = null;37}38}39
40class PowerScheme41{42public Guid Guid { get; private set; }43public string Name { get; private set; }44public bool IsActive { get; private set; }45
46public PowerScheme(string name, Guid guid) : this(name, guid, false) { }47
48public PowerScheme(string name, Guid guid, bool isActive)49{50this.Name = name;51this.Guid = guid;52this.IsActive = isActive;53}54
55public override string ToString()56{57return this.Name;58}59}60
61static Guid GetActivePowerScheme()62{63Guid activeSchema = Guid.Empty;64IntPtr guidPtr = IntPtr.Zero;65
66try67{68var errCode = PowerGetActiveScheme(IntPtr.Zero, out guidPtr);69
70if (errCode != 0) { throw new Exception("GetActiveGuid() failed with code " + errCode); }71if (guidPtr == IntPtr.Zero) { throw new Exception("GetActiveGuid() returned null pointer for GUID"); }72
73activeSchema = (Guid)Marshal.PtrToStructure(guidPtr, typeof(Guid));74}75finally76{77if (guidPtr != IntPtr.Zero) { LocalFree(guidPtr); }78}79
80return activeSchema;81}82
83static void SetActivePowerScheme(Guid guid)84{85var errCode = PowerSetActiveScheme(IntPtr.Zero, ref guid);86if (errCode != 0) { throw new Exception("SetActiveGuid() failed with code " + errCode); }87}88
89private const int ERROR_NO_MORE_ITEMS = 259;90
91static List<PowerScheme> GetPowerSchemes()92{93var activeGuid = GetActivePowerScheme();94return GetPowerSchemesGuids().Select(guid => new PowerScheme(GetPowerPlanName(guid), guid, guid == activeGuid)).ToList();95}96
97static IEnumerable<Guid> GetPowerSchemesGuids()98{99var schemeGuid = Guid.Empty;100
101uint sizeSchemeGuid = (uint)Marshal.SizeOf(typeof(Guid));102uint schemeIndex = 0;103
104while (true)105{106uint errCode = PowerEnumerate(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint)AccessFlags.ACCESS_SCHEME, schemeIndex, ref schemeGuid, ref sizeSchemeGuid);107if (errCode == ERROR_NO_MORE_ITEMS) { yield break; }108if (errCode != 0) { throw new Exception("GetPowerSchemeGUIDs() failed when getting buffer pointer with code " + errCode); }109
110yield return schemeGuid;111schemeIndex++;112}113}114
115static string GetPowerPlanName(Guid guid)116{117string name = string.Empty;118
119IntPtr bufferPointer = IntPtr.Zero;120uint bufferSize = 0;121
122try123{124var errCode = PowerReadFriendlyName(IntPtr.Zero, ref guid, IntPtr.Zero, IntPtr.Zero, bufferPointer, ref bufferSize);125if (errCode != 0) { throw new Exception("GetPowerPlanName() failed when getting buffer size with code " + errCode); }126
127if (bufferSize <= 0) { return String.Empty; }128bufferPointer = Marshal.AllocHGlobal((int)bufferSize);129
130errCode = PowerReadFriendlyName(IntPtr.Zero, ref guid, IntPtr.Zero, IntPtr.Zero, bufferPointer, ref bufferSize);131if (errCode != 0) { throw new Exception("GetPowerPlanName() failed when getting buffer pointer with code " + errCode); }132
133name = Marshal.PtrToStringUni(bufferPointer);134}135finally136{137if (bufferPointer != IntPtr.Zero) { Marshal.FreeHGlobal(bufferPointer); }138}139
140return name;141}142
143[DllImport("kernel32.dll", SetLastError = true)]144static extern IntPtr LocalFree(IntPtr hMem);145
146[DllImport("powrprof.dll", EntryPoint = "PowerSetActiveScheme")]147static extern uint PowerSetActiveScheme(IntPtr UserPowerKey, ref Guid ActivePolicyGuid);148
149[DllImport("powrprof.dll", EntryPoint = "PowerGetActiveScheme")]150static extern uint PowerGetActiveScheme(IntPtr UserPowerKey, out IntPtr ActivePolicyGuid);151
152[DllImport("powrprof.dll", EntryPoint = "PowerReadFriendlyName")]153static extern uint PowerReadFriendlyName(IntPtr RootPowerKey, ref Guid SchemeGuid, IntPtr SubGroupOfPowerSettingsGuid, IntPtr PowerSettingGuid, IntPtr BufferPtr, ref uint BufferSize);154
155[DllImport("PowrProf.dll")]156static extern UInt32 PowerEnumerate(IntPtr RootPowerKey, IntPtr SchemeGuid, IntPtr SubGroupOfPowerSettingGuid, UInt32 AcessFlags, UInt32 Index, ref Guid Buffer, ref UInt32 BufferSize);157
158enum AccessFlags : uint159{160ACCESS_SCHEME = 16,161ACCESS_SUBGROUP = 17,162ACCESS_INDIVIDUAL_SETTING = 18163}164}165}
166