มีวิธีรันโปรแกรมบนเหตุการณ์พลังงานหรือไม่?


11

โดยทั่วไปฉันกำลังมองหาวิธีดำเนินการแอปพลิเคชันเมื่อแล็ปท็อปของฉันเปลี่ยนเป็นพลังงานจากแบตเตอรี่และในทำนองเดียวกันเมื่อกลับสู่ AC

มีตะขอในตัวใน Windows หรือแอปพลิเคชันของบุคคลที่สามที่อนุญาตให้ฉันตอบเหตุการณ์ดังกล่าวหรือไม่

แก้ไข

ฉันได้ดู TaskScheduler พยายามดับภารกิจในเหตุการณ์ "พลังงาน" แต่ดูเหมือนว่าไม่มีเหตุการณ์ใดถูกบันทึกเมื่อเปลี่ยนเป็นแบตเตอรี่


ทำไมฉันถึงรู้สึกว่าฉันจะต้องเขียนแอพนี้ ..
Ryan Emerle

แอปใช้งานได้ แต่คุณอาจต้องใช้สคริปต์
bw

เฮ้ชายฉันไปงานเลี้ยงประมาณหกปี แต่ฉันคิดว่าฉันมีบางสิ่งที่ควรค่าแก่การดู ...
FoxDeploy

คำตอบ:


8

ฉันเขียนแอปพลิเคชัน ( http://batterysaver.codeplex.com/ ) ที่จะฟังข้อความเปลี่ยนโหมดพลังงานและดำเนินการตามการกำหนดค่า XML

หากคนอื่นสามารถใช้มันหรือขยายมันก็ยอดเยี่ยม หากมีสิ่งที่ดีกว่าโปรดโพสต์


เป็นการเพิ่มประสิทธิภาพมากกว่าการเลือกตั้ง 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

4

ไม่ทราบคำสั่งง่ายๆที่คุณสามารถเรียกใช้ได้ แต่สคริปต์ควรสามารถทำสิ่งนี้ได้

ลอง intercepting Win32_PowerManagementEventเหตุการณ์ในPowerShellหรือWSH บทความ tomshardware มีรหัส vbscript บางส่วน แต่ฉันคิดว่าคุณจะต้องมีกรณีสำหรับ eventtype 10 (การเปลี่ยนแปลง powerstate) 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

@ Ryan - ก็ใช่ แอปพลิเคชันที่ลงทะเบียนสำหรับวิธีการ WM_POWERBROADCAST จะดีกว่าในกรณีนั้น
bw

2

ฉันชอบวิธีการของ Bill แต่เขาไม่ได้บอกวิธีการลงทะเบียนสำหรับกิจกรรม WMI ใน PowerShell ดังนั้นนี่คือวิธีการทำ

หากคุณต้องการให้รหัสของคุณเรียกใช้เมื่อสถานะพลังงานของระบบเปลี่ยนไปตามที่อธิบายไว้ที่นี่ให้ใช้รหัสนี้

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.