local $objAsyncContext
; Подключаемся к пространству имен
$objWMIService = ObjGet("winmgmts:" & "!\\" & @ComputerName & "\root\cimv2")
; Создаем объект, получающий события в асинхронном режиме
$Sink = ObjCreate( "WbemScripting.SWbemSink")
; Далее происходит регистрация на событие, где указывается, что обрабатывать данный объект($Sink )
; будет функция, имя которой начинается с префикса "SINK_". В данном случае это и есть функция SINK_OnObjectReady.
ObjEvent($Sink , "SINK_")
;Создаем объект, для определения источника асинхронного вызова
$objContext = ObjCreate("WbemScripting.SWbemNamedValueSet")
; Делаем запрос к WMI на получение событий в асинхронном режиме
; где :
; $Sink - объект запроса
; "SELECT * FROM Win32_PowerManagementEvent" - строка запроса обращающаяся к классу "Win32_PowerManagementEvent"
; "SELECT * FROM Win32_PowerManagementEvent" - буквально можно перевести - "ВЫБОРКА * ИЗ Win32_PowerManagementEvent"
$objWMIservice.ExecNotificationQueryAsync ($Sink, "SELECT * FROM Win32_PowerManagementEvent",Default, Default, Default, $objContext)
While 1
Sleep(1000)
Wend
; Функция обработчик "SINK_OnObjectReady()"
; При получении события вызывается функция SINK_OnObjectReady() (Имя обработчика должно начинаться с префикса "SINK_")
; Параметры:
; $objObject - В данный параметр(переменную) передается объект события $Sink с описанием произошедшего события
; $objAsyncContext - В данный параметр(переменную) передается источник события
Func SINK_OnObjectReady($objObject, $objAsyncContext)
If $objObject.EventType = 10 Then
MsgBox(64,"Info", "Состояние электропитания изменено")
EndIf
EndFunc
; У класса Win32_PowerManagementEvent имеется свойство "EventType". Которое может принимать несколько значений
; 4 - Ввод в спящий режим
; 7 - Выход из спящего режима
; 10 - Изменение состояния электропитания
; 11 - OEM - событие (Даже не знаю, что это такое)
; В Функции-обработчике SINK_OnObjectReady() мы указываем, что
; если произошло событие с типом = 10 (Изменение состояния электропитания),
; Сообщить об этом пользователю