Güç olayları hakkında bir program yürütmenin bir yolu var mı?


11

Temelde dizüstü bilgisayarım pil gücüne geçtiğinde ve benzer şekilde AC'ye döndüğünde bir uygulama yürütmenin bir yolunu arıyorum.

Windows'da yerleşik bir kanca veya bu tür olaylara yanıt vermeme izin verecek bir üçüncü taraf uygulaması var mı?

DÜZENLE

TaskScheduler bir "güç" olay bir görev başlatmak için baktım, ama pil geçerken hiçbir olay günlüğe gibi görünüyor.


Neden bu uygulamayı yazmak gerekecek batan bir duygu var ..
Ryan Emerle

Bir uygulama işe yarayabilir, ancak bir komut dosyasına ihtiyacınız olabilir.
bw

Hey adamım, partiye yaklaşık altı yıl geç kaldım, ama sanırım görülmeye değer bir şeyim var ...
FoxDeploy

Yanıtlar:


8

Bir güç modu değişiklik mesajı dinleyecek ve bir XML yapılandırmasına dayalı eylemler yürütecek bir uygulama ( http://batterysaver.codeplex.com/ ) yazdım .

Başka biri kullanabilir veya genişletebilirse, o zaman harika. Daha iyi bir şey varsa, lütfen gönderin.


GetSystemPowerStatus'u yoklamak yerine, güç durumu değiştiğinde Windows'un gönderdiği WM_POWERBROADCAST iletilerini almak için bir uygulama oluşturun: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301 - bahşiş için teşekkürler; Güç modu değiştirme olayına yanıt vermek için güncelledim.
Ryan Emerle

@RyanEmerle Güzel uygulama!
Moab

@RyanEmerle Çok güzel bir uygulama kabul etti!
Cosco Tech

Güç olaylarında pil profilini değiştirmek istersem, yapılandırmaya ne eklemeliyim?
simongcc

4

Bunun için çalıştırabileceğiniz basit bir komut bilmiyorum, ancak komut dosyası bunu yapabilmelidir.

Müdahale deneyin Win32_PowerManagementEvent olay PowerShell veya WSH . Tomshardware makalede bazı vbscript kodu vardır, ancak olay 10 (powerstate değişiklik) için bir durum gerekir düşünüyorum. StackOverflow'un Windows'un uyku veya Hazırda Bekleme moduna ne zaman girip çıkacağını nasıl bilebilirim? ancak uyku / hazırda bekletme yerine güç durumu değişikliğini ele alma fikrini genişletmeniz gerekir. Ayrıca soru askıya alma / devam ettirmek için ManagementEventWatcher'ı nasıl kullanır? Sorusunun kodunda bazı fikirler bulabilirsiniz.

EDIT: Aslında, böyle bir şey deneyin. Bu tamamen birlikte saldırıya uğradı, bu yüzden hoş değil. DC veya AC gücünde bir değişiklik algılanırsa, Yankı ifadelerini istediğinizi yapın. Şununla koş: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

Fikir, pil gücünden tasarruf etmek için bir durumdan diğerine geçerken uygulamaları başlatmak / durdurmaktır. Bu nedenle, ağır bir komut dosyası (WMI biraz ağır) çalıştırarak amacı yenmek istemiyorum. Ayrıntılı cevap için +1.
Ryan Emerle

@Ryan - evet, evet. Bu durumda WM_POWERBROADCAST yaklaşımı için kayıt yapan bir uygulama daha iyidir.
BW

2

Bill'in yaklaşımını seviyorum, ancak PowerShell'de bir WMI Etkinliğine nasıl kaydolacağınızı söylemiyor, bu yüzden bunu nasıl yapacağınız burada.

Kodunuzun yalnızca burada açıklandığı gibi Sistem Güç Durumu değiştiğinde tetiklenmesini istiyorsanız , bu kodu kullanın.

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

Şimdi, güç fişi her değiştiğinde, cihazı fişe takıp takmadığınızdan veya fişten çektiğinizde tetiklenir. Bu nedenle, soruyu sormak için durup duraklatabilirsiniz:

İktidarda değil miyim?

Neyse ki, bunu WMI Sınıfı üzerinden yapabiliriz BatteryStatus, bu yüzden SADECE bir güç olayı değiştiğinde bir işlemi çalıştırmak için kullandığım tam yapı ve daha sonra sadece artık Güçte değilsem.

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()
     }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.