Gibt es eine Möglichkeit, ein Programm für Leistungsereignisse auszuführen?

11

Ich suche im Grunde nach einer Möglichkeit, eine Anwendung auszuführen, wenn mein Laptop auf Batteriestrom umschaltet und wenn er auf Wechselstrom zurückkehrt.

Gibt es einen integrierten Hook in Windows oder eine Drittanbieteranwendung, mit der ich auf solche Ereignisse reagieren kann?

BEARBEITEN

Ich habe in den TaskScheduler geschaut und versucht, eine Aufgabe bei einem "Power" -Ereignis auszulösen, aber beim Umschalten auf Batterie scheint kein Ereignis protokolliert zu werden.

Ryan Emerle
quelle
Warum habe ich das Gefühl, dass ich diese App schreiben muss
?
Eine App würde funktionieren, aber Sie benötigen möglicherweise nur ein Skript.
bw
Hey Mann, ich war ungefähr sechs Jahre zu spät zur Party, aber ich glaube, ich habe etwas Sehenswertes ...
FoxDeploy

Antworten:

8

Ich habe eine Anwendung ( http://batterysaver.codeplex.com/ ) geschrieben, die auf eine Meldung zum Ändern des Energiemodus wartet und Aktionen basierend auf einer XML-Konfiguration ausführt.

Wenn jemand anderes es verwenden oder erweitern kann, dann großartig. Wenn es etwas Besseres gibt, dann poste es bitte.

Ryan Emerle
quelle
Anstatt GetSystemPowerStatus abzufragen, erstellen Sie als Erweiterung eine Anwendung zum Empfangen von WM_POWERBROADCAST-Nachrichten, die Windows sendet, wenn sich der Energiezustand
shf301
@ shf301 - danke für den Tipp; Ich habe es aktualisiert, um auf das Ereignis zum Ändern des Energiemodus zu reagieren.
Ryan Emerle
@ RyanEmerle Schöne App!
Moab
@ RyanEmerle Einverstanden sehr schöne App!
Cosco Tech
Was muss ich in der Konfiguration hinzufügen, wenn ich das Batterieprofil bei Energieereignissen ändern möchte?
Simongcc
4

Sie kennen keinen einfachen Befehl, den Sie dafür ausführen können, aber Scripting sollte dies können.

Versuchen Sie, das Win32_PowerManagementEvent- Ereignis in PowerShell oder WSH abzufangen . Der Tomshardware-Artikel enthält etwas VBScript-Code, aber ich denke, Sie benötigen einen Fall für Ereignistyp 10 (Powerstate-Änderung). StackOverflow hat einige Ideen unter Wie kann ich wissen, wann Windows in den Ruhezustand oder in den Ruhezustand wechselt? Sie müssen jedoch die Idee erweitern, um die Änderung des Energiezustands anstelle von Ruhezustand / Ruhezustand zu handhaben. Möglicherweise finden Sie im Code auch einige Ideen für die Frage: Wie verwendet man ManagementEventWatcher, um das Anhalten / Fortsetzen zu verfolgen?

EDIT: In der Tat versuchen Sie so etwas. Das ist total zusammen gehackt, also ist es nicht schön. Ändern Sie die Echo-Anweisungen, um zu tun, was Sie wollen, wenn eine Änderung der Gleich- oder Wechselstromversorgung erkannt wird. Laufen Sie mitcscript 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
bw
quelle
Die Idee ist, Anwendungen beim Übergang von einem Zustand in einen anderen zu starten / zu stoppen, um Batteriestrom zu sparen. Daher möchte ich den Zweck nicht durch Ausführen eines schweren Skripts zunichte machen (WMI ist ein bisschen schwer). +1 für die ausführliche Antwort tho.
Ryan Emerle
@ Ryan - na ja. In diesem Fall ist eine Anwendung, die sich für den WM_POWERBROADCAST-Ansatz registriert, besser.
bw
2

Ich mag Bills Ansatz, aber er sagt Ihnen nicht, wie Sie sich für ein WMI-Event in PowerShell registrieren sollen. Hier erfahren Sie, wie Sie dies tun.

Wenn Sie möchten, dass Ihr Code nur ausgelöst wird, wenn sich der Systemstromstatus ändert, wie hier beschrieben , verwenden Sie diesen Code.

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

Dies wird nun ausgelöst, wenn sich der Stromstatus ändert, unabhängig davon, ob Sie das Gerät anschließen oder ausstecken. Vielleicht möchten Sie weiter anhalten und eine Pause einlegen, um die Frage zu stellen:

Bin ich an der Macht oder nicht?

Glücklicherweise können wir dies über die WMI-Klasse BatteryStatustun. Hier ist das vollständige Konstrukt, mit dem ich NUR eine Operation ausführe, wenn sich ein Energieereignis ändert, und dann nur, wenn ich nicht mehr mit Strom versorgt bin.

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