電源イベントでプログラムを実行する方法はありますか?


11

私は基本的に、ラップトップがバッテリ電源に移行したとき、および同様にACに戻ったときに、アプリケーションを実行する方法を探しています。

そのようなイベントに応答できるようにするWindowsまたはサードパーティのアプリケーションに組み込みのフックはありますか?

編集

「電源」イベントでタスクを起動しようとしているTaskSchedulerを調べましたが、バッテリーに切り替えたときにイベントがログに記録されていないようです。


なぜ私は..私はこのアプリを書くために必要につもりだという沈む気持ちを持っていない
ライアンEmerle

アプリは機能しますが、スクリプトが必要なだけかもしれません。
bw

ねえ、私はパーティーに約6年遅れていましたが、私は見る価値があるものがあると思います...
FoxDeploy

回答:


8

電源モード変更メッセージをリッスンし、XML構成に基づいてアクションを実行するアプリケーション(http://batterysaver.codeplex.com/)を作成しました。

他の誰かがそれを使用したり拡張したりできるとしたら、それは素晴らしいことです。もっと良いものがあれば投稿してください。


:電源状態が変化したときGetSystemPowerStatusは、Windowsが送信するWM_POWERBROADCASTメッセージを受信するアプリケーションを作成するというよりも、ポーリング機能拡張として、msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301-ヒントをありがとう; パワーモード変更イベントに対応するように更新しました。
Ryan Emerle

@RyanEmerleナイスアプリ!
Moab

@RyanEmerleとても素敵なアプリに同意しました!
Cosco Tech

電源イベントでバッテリープロファイルを変更する場合、構成に何を追加すればよいですか?
simongcc 2017年

4

このために実行できる簡単なコマンドを知らないが、スクリプトでこれを実行できるはずです。

PowerShellまたはWSHWin32_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

アイデアは、バッテリー電力を節約するために、ある状態から別の状態に移行するときにアプリケーションを開始/停止することです。そのため、重いスクリプトを実行して目的を無効にしたくありません(WMIは少し重いです)。詳細な答えは+1です。
Ryan Emerle

@ライアン-ええ、ええ。その場合、WM_POWERBROADCASTアプローチに登録するアプリケーションの方が適しています。
bw

2

ビルのアプローチは大好きですが、彼は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()
     }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.