Dites au système d'exploitation de recharger les valeurs de délai d'alimentation à partir du registre

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

Question

J'ai du code que j'utilise pour mettre à jour la durée pendant laquelle l'appareil attendra avant de se mettre en veille.

Je mets à jour le registre, puis j'essaie de dire au système d'exploitation de recharger la valeur, mais cela ne fonctionne pas.(La partie rechargement ne fonctionne pas.Le registre se met à jour correctement.)

Je vais poster mon code dans l'espoir que quelqu'un sache ce que je fais de mal :

// 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);

J'appelle ça avec ChangeBatteryTimeout(10); mais, pendant que le registre change, l'appareil ne se met pas en veille au bout de 10 secondes.(Cela prend la valeur précédemment définie de 190 secondes.)

Toute aide serait appréciée.

Était-ce utile?

La solution

Jetez un œil au code source du panneau de configuration dans la source publique CE (vous avez déjà téléchargé Platform Builder, n'est-ce pas ?).IIRC lorsque vous effectuez le changement, il diffuse un WM_SETTINGCHANGE message.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top