2

刚买了一个 APC 备用电池并将 USB 数据线连接到我的 Windows 7 计算机。它自动安装了一个驱动程序,现在在 Windows 托盘中我看到一个带有电源插头图标的电池,它显示了一个充电百分比。当我从墙上拔下 UPS 时,桌面进入电池模式,小图标发生变化……就像笔记本电脑一样。

我想做的是在这个事件发生时运行一个任务。不幸的是,电源状态的更改不会在事件查看器中记录事件,因此我可以将任务附加到它。显然有些事情正在发生,因为图标正在改变。当电源状态变为电池时,如何记录事件?

谢谢,广告

4

1 回答 1

1

One way to do this is with a script running all the time using WMI notifications. Below is a script that watches for changes to objects in the Win32_Battery WMI class and reports on the changes made:

strComputer = "."

' Connect to WMI
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

'Create the Sink object used for the asynchronous notification.
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")

' Send the query asynchronously.  The SINK_OnObjectReady subroutine will be
' called if any data comes in.
objWMIService.ExecNotificationQueryAsync objSink, "SELECT * FROM __InstanceModificationEvent WITHIN 1 WHERE " _
    & "TargetInstance ISA 'Win32_Battery'"

while 1
    Wscript.Sleep(1000)
Wend

Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
    WScript.Echo "Asynchronous operation is done."
End Sub

Dim intLastLevel
intLastLevel = 0

Sub SINK_OnObjectReady(objObject, objAsyncContext)
    ' This runs whenever a change is made to the Win32_Battery object for 
    ' your computer's battery.  For more useful properties of this class, 
    ' see: http://msdn.microsoft.com/en-us/library/aa394074(v=vs.85).aspx
    Set objEvent=objObject.TargetInstance

    Select Case objEvent.BatteryStatus
        Case 1
            if intLastLevel <> objEvent.EstimatedChargeRemaining Then
                Wscript.Echo "Battery is discharging."
                Wscript.Echo "Battery has", objEvent.EstimatedChargeRemaining + 1, "% left on battery."
                Wscript.Echo "Battery has", objEvent.EstimatedRunTime, " minutes left on battery."
                intLastLevel = objEvent.EstimatedChargeRemaining
            End If
        Case 2
            Wscript.Echo "Battery is connected to AC."
        Case 3
            Wscript.Echo "Battery is fully charged."
        Case 4
            Wscript.Echo "Battery is currently low."
        Case 5
            Wscript.Echo "Battery is currently critically low."
        Case 6
            Wscript.Echo "Battery is currrently charging."
            Wscript.Echo "Battery has", objEvent.BatteryRechargeTime, "minutes until it is fully charged."
        Case 7
            Wscript.Echo "Battery is currrently charging and has high charge."
            Wscript.Echo "Battery has", objEvent.BatteryRechargeTime, "minutes until it is fully charged."
        Case 8
            Wscript.Echo "Battery is currrently charging and has low charge."
            Wscript.Echo "Battery has", objEvent.BatteryRechargeTime, "minutes until it is fully charged."
        Case 9
            Wscript.Echo "Battery is currrently charging and has critically low charge."
            Wscript.Echo "Battery has", objEvent.BatteryRechargeTime, "minutes until it is fully charged."
        Case 10
            Wscript.Echo "Battery doesn't know what's going on."
        Case 11
            Wscript.Echo "Battery is partially charged."
    End Select

End Sub

Hope this helps, drop me a line if you have any questions.

于 2013-10-29T23:28:30.660 回答