Скажите ОС, чтобы перезагрузить значения тайм-аута мощности из реестра

StackOverflow https://stackoverflow.com/questions/3250929

Вопрос

У меня есть какой-то код, который я использую для обновления количества времени, которое устройство будет подождать, прежде чем спать.

Я обновляю реестр, а затем попробуйте сообщить ОС для перезагрузки значения, но не работает.(Часть перезарядки не работает. Реестр обновляется нормально.)

Я собираюсь опубликовать свой код в надежде, что кто-то знает, что я делаю не так:

// 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 Сообщение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top