Чи є спосіб виконати програму на владних заходах?


11

Я в основному шукаю спосіб виконання програми, коли мій ноутбук переходить до живлення від акумулятора і, аналогічно, коли він повертається до змінного струму.

Чи є вбудований гачок у Windows або сторонній додаток, який дозволить мені реагувати на такі події?

EDIT

Я заглянув у TaskScheduler, що намагається зняти завдання з події "живлення", але, здається, жодна подія не реєструється при переході на акумулятор.


Чому у мене відчуття затонулості, що мені потрібно буде написати цю програму ..
Ryan Emerle

Додаток буде працювати, але вам може знадобитися просто сценарій.
bw

Ей, чоловіче, я спізнився десь на шість років, але я думаю, що мені щось варто побачити ...
FoxDeploy

Відповіді:


8

Я написав програму ( http://batterysaver.codeplex.com/ ), яка буде слухати повідомлення про зміну режиму живлення та виконувати дії на основі конфігурації XML.

Якщо хтось інший може ним скористатися або розширити, то це приголомшливо. Якщо є щось краще, будь ласка, опублікуйте це.


Як доповнення, а не для опитування GetSystemPowerStatus створіть програму для отримання WM_POWERBROADCAST повідомлень, які Windows надсилає, коли стан живлення змінюється: msdn.microsoft.com/en-us/library/aa373247%28VS.85%29.aspx
shf301

@ shf301 - дякую за пораду; Я оновив його, щоб відповісти на подію зміни режиму живлення.
Райан Емерле

@RyanEmerle Приємний додаток!
Моаб

@RyanEmerle Погодився дуже приємне додаток!
Cosco Tech

Якщо я хочу змінити профіль акумулятора в подіях живлення, що мені потрібно додати в конфігурацію?
simongcc

4

Не знайте просту команду, яку можна виконати для цього, але сценарій повинен це робити.

Спробуйте перехопити подію Win32_PowerManagementEvent в PowerShell або WSH . У статті tomshardware є якийсь код vbscript, але я думаю, вам знадобиться справа для eventtype 10 (зміна стану). StackOverflow має деякі ідеї на тему: Як я можу дізнатися, коли Windows переходить у режим сну чи у сплячий режим? , хоча вам доведеться поширити ідею щодо зміни стану живлення замість сну / сну. Ви також можете знайти деякі ідеї в коді для питання. Як користуватися ManagementEventWatcher для відстеження призупинення / відновлення?

EDIT: Справді, спробуйте щось подібне. Це повністю зламано разом, тому це не дуже. Змініть заяви Echo, щоб робити все, що завгодно, якщо буде виявлено зміну на постійний або змінного струму. Бігайте з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 - добре, так. У цьому випадку краще зареєструвати додаток для підходу WM_POWERBROADCAST.
bw

2

Мені подобається підхід Білла, але він не розповідає вам, як зареєструватися на WMI-подію в PowerShell, ось ось як це зробити.

Якщо ви хочете, щоб ваш код запускався лише тоді, коли стан Power System змінюється, як описано тут , використовуйте цей код.

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()
     }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.