私は基本的に、ラップトップがバッテリ電源に移行したとき、および同様にACに戻ったときに、アプリケーションを実行する方法を探しています。
そのようなイベントに応答できるようにするWindowsまたはサードパーティのアプリケーションに組み込みのフックはありますか?
編集
「電源」イベントでタスクを起動しようとしているTaskSchedulerを調べましたが、バッテリーに切り替えたときにイベントがログに記録されていないようです。
私は基本的に、ラップトップがバッテリ電源に移行したとき、および同様にACに戻ったときに、アプリケーションを実行する方法を探しています。
そのようなイベントに応答できるようにするWindowsまたはサードパーティのアプリケーションに組み込みのフックはありますか?
編集
「電源」イベントでタスクを起動しようとしているTaskSchedulerを調べましたが、バッテリーに切り替えたときにイベントがログに記録されていないようです。
回答:
電源モード変更メッセージをリッスンし、XML構成に基づいてアクションを実行するアプリケーション(http://batterysaver.codeplex.com/)を作成しました。
他の誰かがそれを使用したり拡張したりできるとしたら、それは素晴らしいことです。もっと良いものがあれば投稿してください。
このために実行できる簡単なコマンドを知らないが、スクリプトでこれを実行できるはずです。
PowerShellまたはWSHでWin32_PowerManagementEventイベントをインターセプトしてみてください。tomshardwareの記事にはいくつかのvbscriptコードがありますが、イベントタイプ10(電源状態の変更)のケースが必要になると思います。StackOverflowは、Windowsがスリープモードまたは休止モードに入ったり出たりするタイミングを知る方法を教えてください。ただし、スリープ/休止状態ではなく、電源状態の変更を処理するためにアイデアを拡張する必要があります。コードで質問のいくつかのアイデアを見つけることもできます。どのようにManagementEventWatcherを使用して中断/再開を追跡するのですか?
編集:実際には、このようなことを試してください。これは完全にハッキングされているため、きれいではありません。Echoステートメントを変更して、DCまたはAC電源への変更が検出された場合に必要な処理を実行します。で実行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
ビルのアプローチは大好きですが、彼はPowerShellでWMIイベントに登録する方法を教えてくれないので、ここでその方法を説明します。
ここで説明するように、システムの電源状態が変化したときにのみコードをトリガーする場合は、このコードを使用します。
Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
-sourceIdentifier "Power" `
-action {
#YourCodeHere
}
これで、デバイスが接続されているか、プラグが抜かれているかに関係なく、電源状態が変化するたびにトリガーされます。したがって、質問を停止するために停止して一時停止することもできます。
私は電源が入っているかどうか?
幸い、WMIクラスを介してそれを行うことができるBatteryStatus
ので、電源イベントが変更されたときにのみ操作を実行するために使用する完全な構造を以下に示します。
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()
}