Có cách nào để thực hiện một chương trình về các sự kiện quyền lực không?


11

Về cơ bản, tôi đang tìm cách để thực thi một ứng dụng khi máy tính xách tay của tôi chuyển sang nguồn pin và tương tự, khi nó trở về AC.

Có một hook tích hợp trong Windows hoặc ứng dụng của bên thứ ba sẽ cho phép tôi phản hồi các sự kiện như vậy không?

BIÊN TẬP

Tôi đã xem xét TaskScheduler khi cố gắng thực hiện một tác vụ trong sự kiện "cấp nguồn", nhưng dường như không có sự kiện nào được ghi lại khi chuyển sang pin.


Tại sao tôi có cảm giác chìm mà tôi sẽ cần phải viết ứng dụng này ..
Ryan Emerle 17/03/2016

Một ứng dụng sẽ hoạt động, nhưng bạn có thể chỉ cần một tập lệnh.
bw

Này anh bạn, tôi đến bữa tiệc muộn khoảng sáu năm, nhưng tôi nghĩ rằng tôi đã có một cái gì đó đáng xem ...
FoxDeploy

Câu trả lời:


8

Tôi đã viết một ứng dụng ( http://batterysaver.codeplex.com/ ) sẽ lắng nghe thông báo thay đổi chế độ năng lượng và thực hiện các hành động dựa trên cấu hình XML.

Nếu ai đó có thể sử dụng nó, hoặc mở rộng nó, thì thật tuyệt vời. Nếu có cái gì đó tốt hơn, xin vui lòng gửi nó.


Là một nâng cao, chứ không phải là bỏ phiếu GetSystemPowerStatus tạo ra một ứng dụng để nhận được một thông điệp WM_POWERBROADCAST rằng Windows sẽ gửi khi quyền lực nhà nước thay đổi: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301 - cảm ơn vì tiền boa; Tôi đã cập nhật nó để đáp ứng với sự kiện thay đổi chế độ năng lượng.
Ryan Emerle

@RyanEmerle Ứng dụng đẹp!
Moab

@RyanEmerle Đồng ý ứng dụng rất hay!
Cosco Tech

Nếu tôi muốn thay đổi cấu hình pin trong các sự kiện nguồn điện, tôi nên thêm gì vào cấu hình?
simongcc

4

Không biết một lệnh đơn giản mà bạn có thể chạy cho việc này, nhưng kịch bản sẽ có thể thực hiện điều này.

Hãy thử chặn sự kiện Win32_PowerMan ManagementEvent trong PowerShell hoặc WSH . Bài viết tomshardware có một số mã vbscript, nhưng tôi nghĩ bạn sẽ cần một trường hợp cho sự kiện 10 (thay đổi powerstate). StackOverflow có một số ý tưởng tại Làm sao tôi có thể biết khi nào Windows sẽ vào / ra khỏi chế độ ngủ hoặc chế độ Hibernate? , mặc dù bạn sẽ phải mở rộng ý tưởng để xử lý thay đổi trạng thái năng lượng thay vì ngủ / ngủ đông. Bạn cũng có thể tìm thấy một số ý tưởng trong mã cho câu hỏi Làm thế nào một người sử dụng ManagementEventWatcher để theo dõi đình chỉ / tiếp tục?

EDIT: Trong thực tế, hãy thử một cái gì đó như thế này. Điều này hoàn toàn bị hack cùng nhau, vì vậy nó không đẹp. Thay đổi các câu lệnh Echo để làm bất cứ điều gì bạn muốn nếu thay đổi thành nguồn DC hoặc AC được phát hiện. Chạy vớicscript 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

Ý tưởng là bắt đầu / dừng các ứng dụng khi chuyển từ trạng thái này sang trạng thái khác để tiết kiệm pin. Do đó, tôi không muốn đánh bại mục đích bằng cách chạy một kịch bản nặng (WMI hơi nặng). +1 cho câu trả lời chi tiết tho.
Ryan Emerle 17/03/2016

@Ryan - tốt, vâng. Một ứng dụng đăng ký cho phương pháp WM_POWERBROADCAST sẽ tốt hơn trong trường hợp đó.
bw

2

Tôi thích cách tiếp cận của Bill, nhưng anh ấy không cho bạn biết cách đăng ký Sự kiện WMI trong PowerShell, vì vậy đây là cách thực hiện.

Nếu bạn muốn mã của mình chỉ kích hoạt khi Trạng thái nguồn hệ thống thay đổi, như được mô tả ở đây , hãy sử dụng mã này.

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
 -sourceIdentifier "Power" `
 -action {
     #YourCodeHere
      }

Bây giờ, điều này sẽ kích hoạt bất cứ khi nào trạng thái nguồn thay đổi, cho dù bạn cắm thiết bị vào, HOẶC rút phích cắm thiết bị. Vì vậy, bạn có thể muốn dừng lại và tạm dừng để đặt câu hỏi:

Tôi có quyền lực hay không?

May mắn thay, chúng ta có thể thực hiện điều đó thông qua Lớp WMI BatteryStatus, vì vậy đây là cấu trúc đầy đủ mà tôi sử dụng để CHỈ chạy một hoạt động khi sự kiện điện thay đổi, và sau đó chỉ khi tôi không còn bật Nguồn nữa.

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()
     }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.