Смена параметров электропитания
хочу написать программу для смены действия при закрытии крышки ноутбука, но почему-то не получается поменять этот параметр. Пробовал и AC, и DC функции. Все вызовы завершаются успешно.
class PowerScheme
{
[DllImport("powrprof.dll")]
static extern uint PowerEnumerate(
IntPtr RootPowerKey,
ref Guid SchemeGuid,
ref Guid SubGroupOfPowerSetting,
uint AccessFlags,
uint Index,
ref Guid Buffer,
ref uint BufferSize);
[DllImport("powrprof.dll")]
static extern uint PowerGetActiveScheme(
IntPtr UserRootPowerKey,
ref IntPtr ActivePolicyGuid);
[DllImport("powrprof.dll")]
static extern uint PowerReadDCValue(
IntPtr RootPowerKey,
ref Guid SchemeGuid,
IntPtr SubGroupOfPowerSettingGuid,
ref Guid PowerSettingGuid,
ref int Type,
ref IntPtr Buffer,
ref uint BufferSize
);
[DllImport("powrprof.dll")]
static extern uint PowerWriteDCValueIndex(
IntPtr RootPowerKey,
ref Guid SchemeGuid,
ref Guid SubGroupOfPowerSettingGuid,
ref Guid PowerSettingGuid,
uint AcValueIndex
);
[DllImport("PowrProf.dll")]
static extern uint PowerSetActiveScheme(
IntPtr UserRootPowerKey,
ref Guid SchemeGuid);
[DllImport("powrprof.dll", CharSet = CharSet.Unicode)]
[DllImport("PowrProf.dll")]
public static extern UInt32 PowerEnumerate(IntPtr RootPowerKey, IntPtr SchemeGuid, IntPtr SubGroupOfPowerSettingGuid, UInt32 AcessFlags, UInt32 Index, ref Guid Buffer, ref UInt32 BufferSize);
[DllImport("PowrProf.dll")]
public static extern UInt32 PowerReadFriendlyName(IntPtr RootPowerKey, ref Guid SchemeGuid, IntPtr SubGroupOfPowerSettingGuid, IntPtr PowerSettingGuid, IntPtr Buffer, ref UInt32 BufferSize);
public enum AccessFlags : uint
{
ACCESS_SCHEME = 16,
ACCESS_SUBGROUP = 17,
ACCESS_INDIVIDUAL_SETTING = 18
}
public enum LidAction : uint
{
DoNothing = 0,
Sleep = 1,
Hibernate = 2,
ShutDown = 3
}
private const uint ERROR_MORE_DATA = 234;
public static Guid[] PowerSchemeGetAll()
{
var schemeGuid = Guid.Empty;
uint sizeSchemeGuid = (uint)Marshal.SizeOf(typeof(Guid));
uint schemeIndex = 0;
List<Guid> guidList = new List<Guid>();
while (PowerEnumerate(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint)AccessFlags.ACCESS_SCHEME, schemeIndex, ref schemeGuid, ref sizeSchemeGuid) == 0)
{
guidList.Add(schemeGuid);
schemeIndex++;
}
return guidList.ToArray();
}
public static uint PowerSchemeGetLidAction(ref Guid powerScheme, ref LidAction value)
{
uint res;
//Get the Power Settings
Guid actionGuid = Guid.Empty;
uint index = 0;
uint BufferSize = Convert.ToUInt32(Marshal.SizeOf(typeof(Guid)));
while (PowerEnumerate(IntPtr.Zero, ref powerScheme, ref GUID_SYSTEM_BUTTON_SUBGROUP,
18, index, ref actionGuid, ref BufferSize) == 0) {
/* Search for lid action by Guid */
if (actionGuid != POWER_BUTTON_ACTION) {
index++;
continue;
}
uint size = 4;
IntPtr temp = IntPtr.Zero;
int type = 0;
res = PowerReadDCValue(IntPtr.Zero, ref powerScheme, IntPtr.Zero,
ref actionGuid, ref type, ref temp, ref size);
if (res != 0) {
/* error handling */
return res;
}
value = (LidAction)temp;
return 0;
}
return 2;
}
public static uint PowerSchemeSetLidAction(ref Guid powerScheme, LidAction value)
{
uint res;
res = PowerWriteDCValueIndex(IntPtr.Zero, ref powerScheme, ref GUID_SYSTEM_BUTTON_SUBGROUP,
ref POWER_BUTTON_ACTION, (uint)value);
if (res == 0)
res = PowerSetActiveScheme(IntPtr.Zero, ref powerScheme);
return res;
}
public static void EnumerateAllSchemes()
{
var guidPlans = PowerSchemeGetAll();
Guid tmpGuid;
foreach (Guid guidPlan in guidPlans)
{
tmpGuid = guidPlan;
Console.WriteLine(ReadFriendlyName(guidPlan) + "\t" + guidPlan.ToString());
LidAction lidAction = LidAction.DoNothing;
if (PowerSchemeGetLidAction(ref tmpGuid, ref lidAction) == 0)
Console.WriteLine("Действие закрытия крышки = " + lidAction.ToString());
PowerSchemeSetLidAction(ref tmpGuid, LidAction.DoNothing);
if (PowerSchemeGetLidAction(ref tmpGuid, ref lidAction) == 0)
Console.WriteLine("Действие закрытия крышки = " + lidAction.ToString());
}
}