전원 이벤트에서 프로그램을 실행하는 방법이 있습니까?


11

나는 기본적으로 랩톱이 배터리 전원으로 전환 될 때와 마찬가지로 AC로 돌아갈 때 응용 프로그램을 실행하는 방법을 찾고 있습니다.

Windows 또는 타사 응용 프로그램에 이러한 이벤트에 응답 할 수있는 기본 제공 후크가 있습니까?

편집하다

"전원"이벤트에서 작업을 시작하려고하는 TaskScheduler를 살펴 봤지만 배터리로 전환 할 때 이벤트가 기록되지 않는 것 같습니다.


이 응용 프로그램을 작성해야 할 싱킹 느낌이 나는 이유는 무엇입니까 ..
Ryan Emerle

앱은 작동하지만 스크립트가 필요할 수 있습니다.
bw

이봐, 난 파티에 약 6 년 늦었지만, 볼만한 가치가 있다고 생각합니다.
FoxDeploy

답변:


8

전원 모드 변경 메시지를 수신하고 XML 구성을 기반으로 작업을 실행 하는 응용 프로그램 ( http://batterysaver.codeplex.com/ )을 작성했습니다 .

다른 사람이 그것을 사용하거나 확장 할 수 있다면 굉장합니다. 더 좋은 것이 있으면 게시하십시오.


향상된 기능으로, GetSystemPowerStatus를 폴링하는 대신 전원 상태가 변경 될 때 Windows가 보내는 WM_POWERBROADCAST 메시지를 수신하는 응용 프로그램을 만듭니다. msdn.microsoft.com/ko-kr/library/aa373247%28VS.85%29.aspx
shf301

@ shf301-팁 주셔서 감사합니다; 전원 모드 변경 이벤트에 응답하도록 업데이트했습니다.
Ryan Emerle

@RyanEmerle 니스 앱!
Moab

@RyanEmerle 합의 아주 좋은 응용 프로그램!
Cosco Tech

전원 이벤트에서 배터리 프로필을 변경하려면 구성에서 무엇을 추가해야합니까?
simongcc 2012 년

4

이를 위해 실행할 수있는 간단한 명령을 모르지만 스크립팅이이를 수행 할 수 있어야합니다.

PowerShell 또는 WSH 에서 Win32_PowerManagementEvent 이벤트를 가로 채십시오 . tomshardware 기사에는 vbscript 코드가 있지만 이벤트 유형 10 (전원 상태 변경)에 대한 사례가 필요하다고 생각합니다. StackOverflow는 Windows가 절전 모드 또는 최대 절전 모드로 전환 될 때 어떻게 알 수 있습니까?에 대한 아이디어가 있습니다. 절전 / 최대 절전 모드 대신 전원 상태 변경을 처리하도록 아이디어를 확장해야합니다. 또한 코드의 코드에서 ManagementEventWatcher를 사용하여 일시 중지 / 재개를 어떻게 추적합니까?에 대한 아이디어를 찾을 수 있습니다 .

편집 : 실제로 이와 같은 것을 시도하십시오. 이것은 완전히 해킹되어 있으므로 예쁘지 않습니다. 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

@Ryan-글쎄요. 이 경우 WM_POWERBROADCAST 접근 방식을 등록하는 애플리케이션이 더 좋습니다.
bw

2

Bill의 접근 방식이 마음에 들지만 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.