2015-01-23 9 views
7

Sto creando un'applicazione che mette il computer in stato di ibernazione per alcune ore o anche un'intera settimana (Utilizzo di un WaitableTimer e WaitForSingleObject).Controllare il motivo per cui il computer ha ripreso dallo stato di ibernazione

ci sono tre ragioni per cui il computer potrebbe Wake-up

  1. Il timer waitable è scaduto e il computer riprende come da programma.
  2. L'utente preme il pulsante di accensione che riprende il computer.
  3. Il computer si accende in modo imprevisto.

Le prime due ragioni sono perfettamente accettabili, sono ciò per cui è progettato il sistema. La terza ragione ovviamente non è così bella.

Mi piacerebbe essere in grado di distinguere tra questi tre motivi per l'accensione. C'è un modo per fare questo? Sembra qui che nel primo scenario il metodo WaitForSingleObject debba restituire WAIT_OBJECT_0(source). Se questo non è il caso, è lo scenario 2 o 3, ma non sono sicuro di come distinguere tra i due. Esiste un'API per verificare il motivo della ripresa dalla modalità standby?

Un'altra opzione (migliore) è proibire ad altri dispositivi/software di riattivare il computer (ad esempio eliminando lo scenario 3). Ho disattivato le funzionalità di attivazione di tutti i dispositivi che vedo quando corro powercfg -devicequery -wake_armed (quando eseguo il comando ora restituisce NONE). Esiste un modo simile per vedere tutto il software (attivo) che ha programmato il riavvio del computer?

(Se la sua qualsiasi aiutare il computer questo software è stato progettato per una superficie di 3 Pro, con il incluso (e aggiornato) di Windows 8.1 del sistema operativo installato)

+0

Non sono sicuro se è come premere il pulsante di accensione, ma premendo i tasti sulla tastiera si riattiva anche il computer (forse anche i clic del mouse ma non ne sono sicuro al 100%). – Deruijter

+0

Giusto per chiarire, stai chiedendo di svegliarsi dagli stati di Hibernate (S4)? Quindi, non da stati Sleep ACPI (S3) o Standby connesso. È corretto? –

+0

Non penso sia possibile. Non riesco a vedere nulla delle specifiche ACPI (http://acpi.info/DOWNLOADS/ACPI_5_Errata%20A.pdf) che fornisce dettagli su messaggi specifici forniti al sistema operativo dopo un evento di ibernazione come la causa della risurrezione. – Dai

risposta

5

1/È possibile interrogare il registro eventi di Windows a vedere che cosa ha causato il computer per svegliarsi:

var log = new EventLog("System"); 
    var wakeUpEntry = (from entry in log.Entries.Cast<EventLogEntry>() 
    where entry.Source == "Microsoft-Windows-Power-Troubleshooter" 
      && entry.InstanceId == 1 
    orderby entry.TimeWritten descending 
    select entry).First(); 

    Console.WriteLine("{0}", wakeUpEntry.Message); 

il messaggio ha una voce "Wake Source" ("4USB Root Hub" per esempio) che si può analizzare se si vuole veramente fare a livello di codice.

2/Si può verificare se qualsiasi programma Windows o esterno è impostare un timer scia sul sistema con questo comando:

powercfg -waketimers 

Se nessuno dei due comandi (il vostro né questo) dimostra nulla, la maggior parte delle possibili le cause sono state eliminate.

3/È anche possibile disattivare completamente i timer di riattivazione su questa macchina. In Windows Opzioni risparmio energia, impostazioni combinazione, Impostazioni piano superiore, Disabilita Consenti timer di riattivazione sotto la sezione disonno. Non sono sicuro che la manutenzione programmata di Windows sia influenzata da questo, ma puoi anche disattivarla, ovviamente.

4/Un'altra sicurezza: assicurarsi che nessun dispositivo nelle impostazioni del BIOS sia autorizzato a riattivare il PC, ogni volta che è configurabile.

+0

Questa è un'ottima risposta. Il registro eventi mi fornisce esattamente le informazioni di cui ho bisogno, e 'powercfg -waketimers' mi ha indicato un altro colpevole (Windows ha programmato il riavvio del computer per la manutenzione, tuttavia sembra non banale eliminare questo waketimer :)). +151;) –

+0

Humbug, Wake Source è sempre "Sconosciuto", non importa se l'ho acceso manualmente o se era un waketimer ... estremamente fastidioso che Windows non riempia questo campo. –

+0

Strano, sulla mia macchina questo campo è quasi sempre impostato: "Dispositivo -Microsoft Mouse e Keyboard Detection Driver (USB)", "Pulsante di accensione", "Dispositivo -USB Root Hub", "Timer - Windows eseguirà 'NT TASK \ Microsoft \ Windows \ TaskScheduler \ Regular Maintenance 'operazione pianificata che ha richiesto il risveglio del computer "... Ho alcune voci" Sconosciuto ", non so a cosa sono correlate. –

0

Dopo aver seguito le istruzioni in this article (soprattutto vedendo quello ultimo svegliato in su con powercfg -lastwake) ho trovato una menzione (in this linked article) che:

di Windows 10 ha una nuova “feature” che risveglia il computer up per quello che chiamano “importanti timer di riattivazione”, e si vuole disabilitare che se il computer sta svegliando tutto il tempo. Dirigiti verso Power Options proprio come mostrato sopra, e poi trova Sleep -> Consenti timer di scia -> Collegato e modifica l'impostazione da Importanti timer di sveglia solo a Disabilita.

(sottolineatura mia)

abbastanza sicuro che è il colpevole che risveglia il computer dalla modalità di sospensione, ma non hanno confermato.

+0

I timer di sveglia non sono una nuova funzionalità di Windows 10 (non ho idea di cosa sia basato su ThinkGeek).Sono stati in giro per un po ':). Sfortunatamente ho bisogno dei timer della veglia per svegliare il computer quando lo voglio. Alla fine si è scoperto che le attività di manutenzione programmata si riabilitano regolarmente, anche dopo che è stata disabilitata manualmente. Ciò ha causato l'accensione del mio computer indesiderato. –

+0

Penso che intendessero dire che la prioritizzazione dei "timer di attivazione importanti" (opzione) è nuova; come hai scoperto che l'attività di manutenzione programmata si stava riattivando e come l'hai "aggiustata"? – drzaus