Il valore di ritorno di SetThreadExecutionState
è usato per indicare il successo o il fallimento. Questo è descritto nel documentation.
valore di ritorno
Se la funzione riesce, il valore restituito è lo stato di esecuzione thread precedente.
Se la funzione non riesce, il valore restituito è NULL
.
Il valore di NULL
è semplicemente 0
modo da poter controllare per il successo confrontando il valore di ritorno contro 0
. Quindi non ci sarà un'eccezione quando fallisce. Il valore restituito sarà semplicemente 0
. Non aspettarti che le funzioni dell'API di Windows generino eccezioni per segnalare errori. Semplicemente non lo fanno.
Il p/Invoke firma che è necessario, ottenuto da pinvoke.net è:
[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_SYSTEM_REQUIRED = 0x00000001
// Legacy flag, should not be used.
// ES_USER_PRESENT = 0x00000004
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
Quindi è possibile chiamare in questo modo
bool succeeded = (SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS |
EXECUTION_STATE.ES_AWAYMODE_REQUIRED) != 0);
E se la chiamata non riesce poi sollevare un'eccezione come questo :
if (!succeeded)
throw new Win32Exception();
Molto probabilmente il tuo problema è che stai usando ES_AWAYMODE_REQUIRED
. Penso che dovresti usare ES_SYSTEM_REQUIRED
.
fonte
2013-03-05 19:48:14
Se lo chiami una seconda volta, il valore restituito dovrebbe includere i flag impostati per la prima volta. In caso contrario, qualcosa è andato storto. –
Basta eseguire 'powercfg/requests' come amministratore e vedere il risultato. – diversenok