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

Je recherche essentiellement une façon d'exécuter une application lorsque mon ordinateur portable transite vers l'alimentation de la batterie et, de la même manière, lorsqu'il revient à l'AC.

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

MODIFIER

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

J'ai écrit une application ( http://batterysaver.codeplex.com/ ) qui écoutera un message de changement de mode et exécuter des actions en fonction d'une configuration XML.

Si quelqu'un d'autre peut l'utiliser, ou l'étendre, alors génial. S'il y a quelque chose de mieux, alors, postez-le.

Ne sait pas une simple commande 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 comporte un code vbscript, mais je pense que vous aurez besoin d'un cas pour le type d'événement 10 (changement de puissance). StackOverflow a des idées sur Comment puis-je savoir quand Windows entre dans le mode veille ou en mode veille prolongée ou en mode veille prolongée? , Mais vous devrez étendre l'idée pour gérer le changement d'état de l'alimentation au lieu de dormir / hiberner. Vous pourriez également trouver des idées dans le code de la question Comment utiliser ManagementEventWatcher pour suivre la suspension / reprendre?

EDIT: En fait, essayez quelque chose comme ça. Ceci est totalement piraté, donc ce n'est pas joli. Changez les instructions Echo pour faire tout ce que vous voulez si une modification de la puissance DC ou AC est détectée. Exécuter avec cscript 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 

J'aime 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 déclenchera chaque fois que l'état de l'alimentation change, que vous puissiez brancher l'appareil, ou débranchez-le. Vous pourriez donc vouloir arrêter et faire une pause pour poser la question:

Suis-je sur le pouvoir ou non?

Heureusement, nous pouvons le faire via WMI Class BatteryStatus , alors voici la construction complète que j'utilise pour exécuter UNIQUEMENT une opération lorsqu'un événement de puissance change et que si je ne suis plus sur Power.

 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() }