Как отследить смену питания на ноутбуке
Как отследить смену питания на ноутбуке
Дополнение к статье о получении информации об оставшемся заряде батареи ноутбука. Запрос состояния батареи по мере надобности - это хорошо, но будет гораздо правильнее, если система сама будет уведомлять наше приложение об изменении типа электропитания, а также об оставшемся заряде аккумулятора. Сегодня я расскажу, как это делается.
Сперва немного GUID'ов, констант и структур. Они понадобятся нам при работе, но FASM "из коробки" про них ничего не знает.
Code (Assembler) : Убрать нумерацию
- DEVICE_NOTIFY_WINDOW_HANDLE = 0
- PBT_POWERSETTINGCHANGE = 0x8013
- ; GUID {5D3E9A59-E9D5-4B00-A6BD-FF34FF516548}
- GUID_ACDC_POWER_SOURCE \
- dd 05D3E9A59h
- dw 0E9D5h
- dw 04B00h
- db 0A6h, 0BDh, 0FFh, 034h, 0FFh, 051h, 065h, 048h
- ; GUID {A7AD8041-B45A-4CAE-87A3-EECBB468A9E1}
- GUID_BATTERY_PERCENTAGE_REMAINING \
- dd 0A7AD8041h
- dw 0B45Ah
- dw 04CAEh
- db 087h, 0A3h, 0EEh, 0CBh, 0B4h, 068h, 0A9h, 0E1h
- struct POWERBROADCAST_SETTING
- PowerSetting rb 16
- DataLength dd ?
- Data dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Зарегистрировать уведомление на смену питания
- invoke RegisterPowerSettingNotification,[hwnddlg],\
- GUID_ACDC_POWER_SOURCE,\
- DEVICE_NOTIFY_WINDOW_HANDLE
- mov [hNotifyPower],eax
- ; Зарегистрировать уведомление на изменение заряда батареи
- invoke RegisterPowerSettingNotification,[hwnddlg],\
- GUID_BATTERY_PERCENTAGE_REMAINING,\
- DEVICE_NOTIFY_WINDOW_HANDLE
- mov [hNotifyBattery],eax
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_POWERBROADCAST
- je .power
- ...
- ...
- .power:
- ; Изменился параметр из числа подписанных?
- cmp [wparam],PBT_POWERSETTINGCHANGE
- jne .processed
- ; Событие GUID_ACDC_POWER_SOURCE
- push 4
- pop ecx
- mov esi,[lparam]
- mov edi,GUID_ACDC_POWER_SOURCE
- xor eax,eax
- repe cmpsd
- jnz @f
- ; Указатель на структуру POWERBROADCAST_SETTING
- mov eax,[lparam]
- ; [eax+POWERBROADCAST_SETTING.Data] = текущий тип электропитания
- jmp .processed
- @@:
- ; Событие GUID_BATTERY_PERCENTAGE_REMAINING
- push 4
- pop ecx
- mov esi,[lparam]
- mov edi,GUID_BATTERY_PERCENTAGE_REMAINING
- xor eax,eax
- repe cmpsd
- jnz @f
- ; Указатель на структуру POWERBROADCAST_SETTING
- mov eax,[lparam]
- ; [eax+POWERBROADCAST_SETTING.Data] = процент заряда
- jmp .processed
- @@:
Уведомление GUID_BATTERY_PERCENTAGE_REMAINING отправляется системой первый раз после подписки на него, а затем при любом изменении оставшегося заряда батареи. Текущий процент заряда от 0 до 100 передается в параметре Data.
Когда обработка уведомлений больше не требуется, надо отменить подписку с помощью функции UnregisterPowerSettingNotification.
Code (Assembler) : Убрать нумерацию
- ; Убрать регистрацию уведомления
- invoke UnregisterPowerSettingNotification,[hNotifyPower]
- invoke UnregisterPowerSettingNotification,[hNotifyBattery]
Просмотров: 527 | Комментариев: 0
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Комментариeв нет
Добавить комментарий
Заполните форму для добавления комментария