Dites au système d'exploitation de recharger les valeurs de délai d'alimentation à partir du registre
-
15-09-2020 - |
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.
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.