Existe-t-il un moyen d'exécuter un programme sur les événements d'alimentation?


11

Je cherche essentiellement un moyen d'exécuter une application lorsque mon ordinateur portable passe à l'alimentation par batterie et, de la même manière, lorsqu'il revient en courant alternatif.

Existe-t-il un hook intégré dans Windows ou une application tierce qui me permettra de répondre à de tels événements?

ÉDITER

J'ai examiné le TaskScheduler en essayant de déclencher une tâche sur un événement "power", mais aucun événement ne semble être enregistré lors du passage à la batterie.


Pourquoi ai-je l'impression de couler que je vais avoir besoin d'écrire cette application ..
Ryan Emerle

Une application fonctionnerait, mais vous pourriez juste avoir besoin d'un script.
pc

Hé mec, j'avais environ six ans de retard pour la fête, mais je pense que j'ai quelque chose à voir ...
FoxDeploy

Réponses:


8

J'ai écrit une application ( http://batterysaver.codeplex.com/ ) qui écoutera un message de changement de mode d'alimentation et exécutera des actions basées sur une configuration XML.

Si quelqu'un d'autre peut l'utiliser ou l'étendre, c'est génial. S'il y a quelque chose de mieux, veuillez le poster.


Comme amélioration, plutôt que d'interroger GetSystemPowerStatus, créez une application pour recevoir un message WM_POWERBROADCAST que Windows envoie lorsque l'état d'alimentation change: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301 - merci pour l'astuce; Je l'ai mis à jour pour répondre à l'événement de changement de mode d'alimentation.
Ryan Emerle

@RyanEmerle Nice app!
Moab

@RyanEmerle A accepté une très belle application!
Cosco Tech

Si je veux changer le profil de la batterie dans les événements d'alimentation, que dois-je ajouter dans la configuration?
simongcc

4

Je ne connais pas de commande simple que vous pouvez exécuter pour cela, mais les scripts devraient pouvoir le faire.

Essayez d'intercepter l' événement Win32_PowerManagementEvent dans PowerShell ou WSH . L'article de tomshardware contient du code vbscript, mais je pense que vous aurez besoin d'un cas pour le type d'événement 10 (changement de puissance). StackOverflow a quelques idées sur Comment puis-je savoir quand Windows entre / sort du mode veille ou veille prolongée? , mais vous devrez étendre l'idée pour gérer le changement d'état d'alimentation au lieu de veille / veille prolongée. Vous pouvez également trouver quelques idées dans le code de la question Comment utiliser ManagementEventWatcher pour suivre la suspension / reprise?

EDIT: En fait, essayez quelque chose comme ça. C'est totalement piraté ensemble, donc ce n'est pas joli. Modifiez les instructions Echo pour faire ce que vous voulez si une modification de l'alimentation CC ou CA est détectée. Courir aveccscript 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'idée est de démarrer / arrêter les applications lors de la transition d'un état à un autre pour économiser la batterie. Par conséquent, je ne veux pas vaincre le but en exécutant un script lourd (WMI est un peu lourd). +1 pour la réponse détaillée.
Ryan Emerle

@Ryan - eh bien, oui. Une application s'inscrivant pour l'approche WM_POWERBROADCAST est meilleure dans ce cas.
pc

2

J'adore l'approche de Bill, mais il ne vous dit pas comment vous inscrire à un événement WMI dans PowerShell, alors voici comment le faire.

Si vous souhaitez que votre code ne se déclenche que lorsque l'état de l'alimentation du système change, comme décrit ici , utilisez ce code.

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

Maintenant, cela se déclenchera chaque fois que l'état d'alimentation changera, que vous branchiez l'appareil ou le débranchiez. Donc, vous voudrez peut-être arrêter et vous arrêter pour poser la question:

Suis-je au pouvoir ou non?

Heureusement, nous pouvons le faire via la classe WMI BatteryStatus, alors voici la construction complète que j'utilise pour exécuter UNIQUEMENT une opération lorsqu'un événement d'alimentation change, et seulement si je ne suis plus sous tension.

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()
     }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.