나는 기본적으로 랩톱이 배터리 전원으로 전환 될 때와 마찬가지로 AC로 돌아갈 때 응용 프로그램을 실행하는 방법을 찾고 있습니다.
Windows 또는 타사 응용 프로그램에 이러한 이벤트에 응답 할 수있는 기본 제공 후크가 있습니까?
편집하다
"전원"이벤트에서 작업을 시작하려고하는 TaskScheduler를 살펴 봤지만 배터리로 전환 할 때 이벤트가 기록되지 않는 것 같습니다.
나는 기본적으로 랩톱이 배터리 전원으로 전환 될 때와 마찬가지로 AC로 돌아갈 때 응용 프로그램을 실행하는 방법을 찾고 있습니다.
Windows 또는 타사 응용 프로그램에 이러한 이벤트에 응답 할 수있는 기본 제공 후크가 있습니까?
편집하다
"전원"이벤트에서 작업을 시작하려고하는 TaskScheduler를 살펴 봤지만 배터리로 전환 할 때 이벤트가 기록되지 않는 것 같습니다.
답변:
전원 모드 변경 메시지를 수신하고 XML 구성을 기반으로 작업을 실행 하는 응용 프로그램 ( http://batterysaver.codeplex.com/ )을 작성했습니다 .
다른 사람이 그것을 사용하거나 확장 할 수 있다면 굉장합니다. 더 좋은 것이 있으면 게시하십시오.
이를 위해 실행할 수있는 간단한 명령을 모르지만 스크립팅이이를 수행 할 수 있어야합니다.
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
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()
}