C'è un modo per eseguire un programma su eventi di potenza?


11

Sto fondamentalmente cercando un modo per eseguire un'applicazione quando il mio laptop passa alla carica della batteria e, allo stesso modo, quando ritorna in CA.

Esiste un hook integrato in Windows o un'applicazione di terze parti che mi consentirà di rispondere a tali eventi?

MODIFICARE

Ho esaminato TaskScheduler cercando di avviare un'attività su un evento di "alimentazione", ma non sembra essere registrato alcun evento quando si passa alla batteria.


Perché ho la sensazione di affondare che avrò bisogno di scrivere questa app ..
Ryan Emerle

Un'app funzionerebbe, ma potresti aver bisogno solo di uno script.
bw

Ehi amico, ero in ritardo di sei anni alla festa, ma penso di avere qualcosa che vale la pena vedere ...
FoxDeploy,

Risposte:


8

Ho scritto un'applicazione ( http://batterysaver.codeplex.com/ ) che ascolterà un messaggio di modifica della modalità di alimentazione ed eseguirà azioni basate su una configurazione XML.

Se qualcun altro può usarlo o estenderlo, allora fantastico. Se c'è qualcosa di meglio, per favore pubblicalo.


Come un miglioramento, piuttosto che polling GetSystemPowerStatus creare un'applicazione per ricevere un messaggio di WM_POWERBROADCAST che Windows invia quando lo stato di alimentazione cambia: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301 - grazie per il suggerimento; L'ho aggiornato per rispondere all'evento di modifica della modalità di alimentazione.
Ryan Emerle,

@RyanEmerle Bella app!
Moab,

@RyanEmerle Concordato un'app molto bella!
Cosco Tech

Se voglio cambiare il profilo della batteria in caso di eventi di alimentazione, cosa devo aggiungere nella configurazione?
simongcc

4

Non conosci un semplice comando che puoi eseguire per questo, ma gli script dovrebbero essere in grado di farlo.

Prova a intercettare l' evento Win32_PowerManagementEvent in PowerShell o WSH . L'articolo di tomshardware ha del codice vbscript, ma penso che avrai bisogno di un caso per eventtype 10 (modifica di Powerstate). StackOverflow ha alcune idee su Come posso sapere quando Windows entra / esce dalla modalità di sospensione o ibernazione? , anche se dovrai estendere l'idea per gestire il cambiamento dello stato di alimentazione invece di sospensione / ibernazione. Potresti anche trovare alcune idee nel codice per la domanda Come si usa ManagementEventWatcher per tenere traccia della sospensione / ripresa?

EDIT: In effetti, prova qualcosa di simile. Questo è totalmente hackerato insieme, quindi non è carino. Modificare le istruzioni Echo per fare ciò che si desidera se viene rilevata la modifica dell'alimentazione CC o CA. Corri concscript power.vbs

power.vbs

Dim battery_status, prev_status
prev_status = CheckBattery
Set colMonitoredEvents = GetObject("winmgmts:\\.\root\cimv2")._
    ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
Do
    Set strLatestEvent = colMonitoredEvents.NextEvent
    If strLatestEvent.EventType = 10 Then
        battery_status = CheckBattery
        If battery_status <> prev_status Then
            If battery_status = 1 Then
                Wscript.Echo "DC power"
            ElseIf battery_status = 2 Then
                Wscript.Echo "AC power"
            End If
        End If
    End If
    prev_status = battery_status
Loop

Function CheckBattery
    Dim oWMI, items, item
    Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set items = oWMI.ExecQuery("Select * from Win32_Battery",,48)
    For Each item in items
        If item.BatteryStatus = 1 Then
            CheckBattery = 1
            Exit Function
        ElseIf item.BatteryStatus = 2 then
        CheckBattery = 2
            Exit Function
        End If
    Next
End Function

L'idea è di avviare / arrestare le applicazioni durante la transizione da uno stato a un altro per risparmiare la carica della batteria. Pertanto non voglio sconfiggere lo scopo eseguendo uno script pesante (WMI è un po 'pesante). +1 per la risposta dettagliata tho.
Ryan Emerle,

@Ryan - beh, sì. Un'applicazione che si registra per l'approccio WM_POWERBROADCAST è migliore in quel caso.
bw

2

Adoro l'approccio di Bill, ma non ti dice come registrarsi per un evento WMI in PowerShell, quindi ecco come farlo.

Se si desidera che il codice venga attivato solo quando lo stato di alimentazione del sistema cambia, come descritto qui , utilizzare questo codice.

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
 -sourceIdentifier "Power" `
 -action {
     #YourCodeHere
      }

Ora, questo si attiverà ogni volta che cambia lo stato di alimentazione, sia che si colleghi il dispositivo o lo scolleghi. Quindi potresti voler fermarti e fare una pausa per porre la domanda:

Sono al potere o no?

Fortunatamente possiamo farlo tramite la classe WMI BatteryStatus, quindi ecco il costrutto completo che uso per eseguire SOLO un'operazione quando un evento di potenza cambia, e quindi solo se non sono più alimentato.

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
  -sourceIdentifier "Power" `
  -action {
      if ([BOOL](Get-WmiObject -Class BatteryStatus -Namespace root\wmi).PowerOnLine ){
         #Device is plugged in now, do this action
         write-host "Power on!"
     }
    else{
        #Device is NOT plugged in now, do this action
        write-host "Now on battery, locking..."
        [NativeMethods]::LockWorkStation()
     }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.