2013-03-05 4 views
5

Quando si disabilita il sonno sistema utilizzando la seguente riga:Come verificare se la disattivazione della sospensione con SetThreadExecutionState non riesce?

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED); 

Come posso dire che ha funzionato? Ad esempio, su uno dei miei computer, non funziona. Lo stilista va a dormire ma non fa eccezione. Se non c'è eccezione, esiste un altro modo per sapere che la chiamata a SetThreadExecutionSTate non è riuscita?

+0

Se lo chiami una seconda volta, il valore restituito dovrebbe includere i flag impostati per la prima volta. In caso contrario, qualcosa è andato storto. –

+0

Basta eseguire 'powercfg/requests' come amministratore e vedere il risultato. – diversenok

risposta

9

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.

0

La funzione restituisce un valore per indicare se l'operazione è riuscita o meno. Se il valore restituito è NULL, l'operazione non è riuscita. (Source)

Il valore restituito è NULL che equivale a 0.

Si dovrebbe quindi acquisire il valore di ritorno in una variabile e verificare se è pari a zero:

uint result = SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | 
             EXECUTION_STATE.ES_AWAYMODE_REQUIRED); 
if (result != 0) 
{ 
    // Function failed... 
} 
+1

Il problema è che questo metodo restituisce una struct (EXECUTION_STATE) e che non può mai essere nullo: http://www.pinvoke.net/default.aspx/kernel32.setthreadexecutionstate –

+0

Per aggiungere alla mia risposta, il 'EXECUTION_STATE.ES_AWAYMODE_REQUIRED' non è supportato da Windows XP o Windows Server 2003. –

+0

Bene, secondo MSDN, questa funzione restituisce NULL se fallisce ... –