Как получить варианты из выпадающего списка перехода компьютера в спящий режим в C#
Когда запускаю свою программу, в выпадающем списке должны быть варианты значений идентичны тем которые есть в выпадающем списке в настройках операционной системы. Как мне получить эти значения?
Я уже знаю как изменить эти значения (powercfg /change ...), а так же --как получить текущее значение?
Ответы (2 шт):
Раз уж ты используеш шарп, лучше заменить консольную команду на команду из API самой системы.
https://stackoverflow.com/a/7920203/4423545
К сожжалению, само АПИ не предоставляет возможности считать значение напрямую. Но в любом случае эти изменения конфиругации будут внесены в реестр.
Даже без гугления можно запустить RegMon и вручную изменить через настройки на любое значение и просмотреть какое именно значение было изменено в реестре.
Потом можно доставать уже значение из реестра напрямую в твоей программе.
Но раз уж ты спрашиваешь о командах консоли....
То судя по документации ты ищешь: powercfg /waketimers
Эти значения можно получить с помощью WinAPI-функции CallNtPowerInformation.
Пример:
using System;
using System.Runtime.InteropServices;
static void Main()
{
SYSTEM_POWER_POLICY spp;
uint retval = NativeMethods.CallNtPowerInformation(
NativeMethods.SystemPowerPolicyDc,
IntPtr.Zero,
0,
out spp,
Marshal.SizeOf(typeof(SYSTEM_POWER_POLICY))
);
if (retval == NativeMethods.STATUS_SUCCESS)
{
Console.WriteLine("От батареи:");
Console.WriteLine("Отключать дисплей: " + spp.VideoTimeout);
Console.WriteLine("Усыплять компьютер: " + spp.IdleTimeout);
}
retval = NativeMethods.CallNtPowerInformation(
NativeMethods.SystemPowerPolicyAc,
IntPtr.Zero,
0,
out spp,
Marshal.SizeOf(typeof(SYSTEM_POWER_POLICY))
);
if (retval == NativeMethods.STATUS_SUCCESS)
{
Console.WriteLine("От сети:");
Console.WriteLine("Отключать дисплей: " + spp.VideoTimeout);
Console.WriteLine("Усыплять компьютер: " + spp.IdleTimeout);
}
}
Время в секундах.
Выглядит несложно, однако для её использования нужно определить множество структур и перечислений. Их код взят с сайте pinvoke.net.
static class NativeMethods
{
public const int SystemPowerPolicyAc = 0;
public const int SystemPowerPolicyDc = 1;
public const uint STATUS_SUCCESS = 0;
[DllImport("powrprof.dll")]
public static extern uint CallNtPowerInformation(
int InformationLevel,
IntPtr InputBuffer,
int InputBufferLength,
out SYSTEM_POWER_POLICY spi,
int OutputBufferLength
);
}
public enum POWER_ACTION : uint
{
PowerActionNone = 0, // No system power action.
PowerActionReserved, // Reserved; do not use.
PowerActionSleep, // Sleep.
PowerActionHibernate, // Hibernate.
PowerActionShutdown, // Shutdown.
PowerActionShutdownReset, // Shutdown and reset.
PowerActionShutdownOff, // Shutdown and power off.
PowerActionWarmEject, // Warm eject.
}
[Flags]
public enum PowerActionFlags : uint
{
POWER_ACTION_QUERY_ALLOWED = 0x00000001, // Broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation.
POWER_ACTION_UI_ALLOWED = 0x00000002, // Applications can prompt the user for directions on how to prepare for suspension. Sets bit 0 in the Flags parameter passed in the lParam parameter of WM_POWERBROADCAST.
POWER_ACTION_OVERRIDE_APPS = 0x00000004, // Ignores applications that do not respond to the PBT_APMQUERYSUSPEND event broadcast in the WM_POWERBROADCAST message.
POWER_ACTION_LIGHTEST_FIRST = 0x10000000, // Uses the first lightest available sleep state.
POWER_ACTION_LOCK_CONSOLE = 0x20000000, // Requires entry of the system password upon resume from one of the system standby states.
POWER_ACTION_DISABLE_WAKES = 0x40000000, // Disables all wake events.
POWER_ACTION_CRITICAL = 0x80000000, // Forces a critical suspension.
}
[Flags]
public enum PowerActionEventCode : uint
{
POWER_LEVEL_USER_NOTIFY_TEXT = 0x00000001, // User notified using the UI.
POWER_LEVEL_USER_NOTIFY_SOUND = 0x00000002, // User notified using sound.
POWER_LEVEL_USER_NOTIFY_EXEC = 0x00000004, // Specifies a program to be executed.
POWER_USER_NOTIFY_BUTTON = 0x00000008, // Indicates that the power action is in response to a user power button press.
POWER_USER_NOTIFY_SHUTDOWN = 0x00000010, // Indicates a power action of shutdown/off.
POWER_FORCE_TRIGGER_RESET = 0x80000000, // Clears a user power button press.
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct POWER_ACTION_POLICY
{
public POWER_ACTION Action;
public PowerActionFlags Flags;
public PowerActionEventCode EventCode;
}
public enum SYSTEM_POWER_STATE : UInt32
{
PowerSystemUnspecified = 0,
PowerSystemWorking = 1,
PowerSystemSleeping1 = 2,
PowerSystemSleeping2 = 3,
PowerSystemSleeping3 = 4,
PowerSystemHibernate = 5,
PowerSystemShutdown = 6,
PowerSystemMaximum = 7
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct SYSTEM_POWER_LEVEL // SIZE MUST BE 24 bytes
{
public byte Enable;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Spare;
public uint BatteryLevel;
public POWER_ACTION_POLICY PowerPolicy;
public SYSTEM_POWER_STATE MinSystemState;
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct SYSTEM_POWER_POLICY // SIZE MUST BE 232 bytes
{
public uint Revision;
public POWER_ACTION_POLICY PowerButton;
public POWER_ACTION_POLICY SleepButton;
public POWER_ACTION_POLICY LidClose;
public SYSTEM_POWER_STATE LidOpenWake;
public uint Reserved;
public POWER_ACTION_POLICY Idle;
public uint IdleTimeout;
public byte IdleSensitivity;
public byte DynamicThrottle;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] Spare2;
public SYSTEM_POWER_STATE MinSleep;
public SYSTEM_POWER_STATE MaxSleep;
public SYSTEM_POWER_STATE ReducedLatencySleep;
public uint WinLogonFlags;
public uint Spare3;
public uint DozeS4Timeout;
public uint BroadcastCapacityResolution;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public SYSTEM_POWER_LEVEL[] DischargePolicy;
public uint VideoTimeout;
public byte VideoDimDisplay;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public uint[] VideoReserved;
public uint SpindownTimeout;
public byte OptimizeForPower;
public byte FanThrottleTolerance;
public byte ForcedThrottle;
public byte MinThrottle;
public POWER_ACTION_POLICY OverThrottled;
}
Перечисление POWER_INFORMATION_LEVEL не стал добавлять, оставил лишь две нужные константы (Ac/Dc).
