Скажите ОС, чтобы перезагрузить значения тайм-аута мощности из реестра
-
15-09-2020 - |
Вопрос
У меня есть какой-то код, который я использую для обновления количества времени, которое устройство будет подождать, прежде чем спать.
Я обновляю реестр, а затем попробуйте сообщить ОС для перезагрузки значения, но не работает.(Часть перезарядки не работает. Реестр обновляется нормально.)
Я собираюсь опубликовать свой код в надежде, что кто-то знает, что я делаю не так:
// Change the amount of seconds that the OS will wait before it goes to sleep.
public void ChangeBatteryTimeout(int timeoutInSeconds)
{
// Attempt to open the key
RegistryKey key = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Power\\Timeouts", true) ??
// If the return value is null, the key doesn't exist, so create it.
Registry.LocalMachine.CreateSubKey("SYSTEM\\CurrentControlSet\\Control\\Power\\Timeouts");
if (key == null)
throw new KeyNotFoundException("Could not find or make the key for timeout manangment.");
// This value must be set for the timeout stuff to work.
// See:http://msdn.microsoft.com/en-us/library/aa932196.aspx
if (key.GetValue("ACUserIdle") == null)
key.SetValue("ACUserIdle", 0, RegistryValueKind.DWord);
// Set the Battery Suspend Timeout to be the passed in value.
key.SetValue("BattSuspendTimeout", timeoutInSeconds, RegistryValueKind.DWord);
// Signal the OS to reload the value we just changed.
DoAutoResetEvent();
}
// Tell to OS to reload the timeouts.
private static void DoAutoResetEvent()
{
const string eventString = "PowerManager/ReloadActivityTimeouts";
IntPtr newHandle = CreateEvent(IntPtr.Zero, false, false, eventString);
EventModify(newHandle, (int)EventFlags.EVENT_SET);
CloseHandle(newHandle);
}
private enum EventFlags
{
EVENT_PULSE = 1,EVENT_RESET = 2,EVENT_SET = 3
}
[DllImport("coredll.dll", SetLastError = true)]
private static extern IntPtr CreateEvent(IntPtr lpEventAttributes,
bool bManualReset, bool bInitialState, string lpName);
[DllImport("coredll")]
static extern bool EventModify(IntPtr hEvent, int func);
[DllImport("coredll.dll", SetLastError = true)]
private static extern bool CloseHandle(IntPtr hObject);
.
Я называю это с ChangeBatteryTimeout(10);
, но, хотя в то время как реестр изменяется, устройство не спит за 10 секунд.(Это требует ранее установленного значения 190 секунд.)
Любая помощь будет оценена.
Решение
Взгляните на исходный код для панели управления в публичном источнике CE (к настоящему времени вы загрузили строитель платформы, верно?).IIRC, когда вы делаете изменение, это трансляет A wm_settingchange Сообщение.