Domanda

Ho un codice che sto usando per aggiornare la quantità di tempo in cui il dispositivo attenderà prima di andare a dormire.

Aggiorno il registro e poi prova a dire al sistema operativo per ricaricare il valore, ma non funziona.(La parte di ricarica non funziona. Il registro aggiorna bene.)

Ho intenzione di pubblicare il mio codice nella speranza che qualcuno sappia cosa sto facendo male:

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

Lo chiamo con ChangeBatteryTimeout(10); ma, mentre il registro cambia, il dispositivo non può ospitare in 10 secondi.(Prende il valore precedentemente impostato di 190 secondi.)

Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

Dai un'occhiata al codice sorgente per il pannello di controllo nella fonte pubblica CE (hai scaricato Builder Piattaforma ormai, giusto?).IIRC Quando si effettua il cambiamento trasmessa un wm_setingchange Messaggio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top