Apakah ada cara untuk menjalankan program pada peristiwa daya?

11

Saya pada dasarnya mencari cara untuk menjalankan aplikasi ketika laptop saya beralih ke daya baterai dan, ketika itu, kembali ke AC.

Apakah ada pengait bawaan di Windows atau aplikasi pihak ketiga yang memungkinkan saya untuk merespons acara semacam itu?

EDIT

Saya telah melihat TaskScheduler yang mencoba menjalankan tugas pada acara "power", tetapi tampaknya tidak ada kejadian yang dicatat saat beralih ke baterai.

Ryan Emerle
sumber
Mengapa saya memiliki perasaan tenggelam bahwa saya perlu menulis aplikasi ini ..
Ryan Emerle
Aplikasi akan berfungsi, tetapi Anda mungkin hanya membutuhkan skrip.
bw
Hei kawan, aku terlambat enam tahun ke pesta, tapi kurasa aku punya sesuatu yang pantas dilihat ...
FoxDeploy

Jawaban:

8

Saya menulis sebuah aplikasi ( http://batterysaver.codeplex.com/ ) yang akan mendengarkan pesan perubahan mode daya dan menjalankan tindakan berdasarkan konfigurasi XML.

Jika orang lain dapat menggunakannya, atau memperluasnya, maka hebat. Jika ada sesuatu yang lebih baik, silakan kirimkan.

Ryan Emerle
sumber
Sebagai perangkat tambahan, daripada polling GetSystemPowerStatus membuat aplikasi untuk menerima pesan WM_POWERBROADCAST yang dikirim Windows ketika status daya berubah: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301
@ shf301 - terima kasih atas tipnya; Saya memperbaruinya untuk merespons acara perubahan mode daya.
Ryan Emerle
@RyanEmerle Aplikasi yang bagus!
Moab
@RyanEmerle Menyetujui aplikasi yang sangat bagus!
Cosco Tech
Jika saya ingin mengubah profil baterai pada peristiwa daya, apa yang harus saya tambahkan di konfigurasi?
simongcc
4

Tidak tahu perintah sederhana yang dapat Anda jalankan untuk ini, tetapi skrip harus dapat melakukan ini.

Cobalah mencegat acara Win32_PowerManagementEvent di PowerShell atau WSH . Artikel tomshardware memiliki beberapa kode vbscript, tetapi saya pikir Anda perlu casetype 10 (perubahan powerstate). StackOverflow memiliki beberapa ide di Bagaimana saya bisa tahu kapan Windows masuk / keluar dari mode sleep atau Hibernate? , meskipun Anda harus memperluas ide untuk menangani perubahan status daya alih-alih tidur / hibernasi. Anda mungkin juga menemukan beberapa ide dalam kode untuk pertanyaan. Bagaimana cara menggunakan ManagementEventWatcher untuk melacak penangguhan / melanjutkan?

EDIT: Faktanya, coba sesuatu seperti ini. Ini benar-benar diretas bersama, jadi tidak cantik. Ubah pernyataan Echo untuk melakukan apa pun yang Anda inginkan jika perubahan daya DC atau AC terdeteksi. Jalankan dengancscript 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
bw
sumber
Idenya adalah untuk memulai / menghentikan aplikasi saat transisi dari satu kondisi ke kondisi lain untuk menghemat daya baterai. Oleh karena itu saya tidak ingin mengalahkan tujuan dengan menjalankan skrip yang berat (WMI agak berat). +1 untuk jawaban terinci tho.
Ryan Emerle
@Ryan - yah, yeah. Aplikasi yang mendaftar untuk pendekatan WM_POWERBROADCAST lebih baik dalam hal itu.
bw
2

Saya suka pendekatan Bill, tetapi dia tidak memberi tahu Anda cara mendaftar untuk Acara WMI di PowerShell, jadi inilah cara melakukannya.

Jika Anda ingin kode Anda memicu hanya ketika Status Daya Sistem berubah, seperti dijelaskan di sini , gunakan kode ini.

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

Sekarang, ini akan memicu kapan pun status daya berubah, apakah Anda mencolokkan perangkat, atau mencabutnya. Jadi, Anda mungkin ingin berhenti dan berhenti sejenak untuk mengajukan pertanyaan:

Apakah saya berkuasa atau tidak?

Untungnya kita dapat melakukannya melalui Kelas WMI BatteryStatus, jadi inilah konstruksi lengkap yang saya gunakan untuk HANYA menjalankan operasi ketika peristiwa daya berubah, dan hanya jika saya tidak lagi menggunakan Daya.

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()
     }
FoxDeploy
sumber