Как запустить код в Windows Mobile, пока он приостановлен?
Я хотел бы запустить некоторый код C++, пока Windows Mobile PocketPC (или кажется) приостанавливается. Примером, который я имею в виду, является плагин HTC Home, который показывает (среди прочего) вкладку, где HTC Audio Manager можно использовать для воспроизведения mp3-файлов. Когда я нажимаю кнопку включения / выключения, дисплей становится черным, но звук продолжает воспроизводиться. Единственная кнопка для включения - это кнопка включения / выключения, как и ожидалось.
До сих пор я пытался захватить аппаратные нажатия кнопок (работает) и выключить отображение видео (работает). Что не работает с этим подходом, так это то, что при (случайном) нажатии любой клавиши на устройстве включается видеодисплей. Я думаю, что это не тот подход, который используется в HTC Audio Manager.
Я предполагаю, что для этого нужно использовать низкоуровневую магию API, или что код для воспроизведения звука выполняется на каком-то уровне прерывания, или устройство переходит в другой режим ожидания.
2 ответа
Я нашел исходный код на форуме разработчиков xda, который объясняет, что делать, и он работает как задумано. Основными моментами являются:
- Настройте устройство на отправку уведомления при переходе в "автоматический" режим. Это сделано с
PowerPolicyNotify(PPN_UNATTENDEDMODE, TRUE)
- Для каждого устройства, которое вам нужно в автоматическом режиме, звоните
SetPowerRequirement(L"gpd0:", D0, POWER_NAME|POWER_FORCE, NULL, NULL)
; Устройство "gpd0:" является промежуточным драйвером GPS; замените или дублируйте вызов любым устройством, которое вам нужно, например, "wav1:" для аудио, "dsk1:" для карты памяти или "com1:" для последовательного порта 1. - Создайте очередь сообщений и запросите уведомления о мощности, используя
RequestPowerNotifications(hMsgQueue, PBT_POWERINFOCHANGE | PBT_TRANSITION)
- Каждый раз, когда отправляется уведомление о мощности, очередь сообщений заполняется структурой типа
POWER_BROADCAST
, - Ищу
PBT_TRANSITION
тип сообщения. ПолеpPwrBrodcast->SystemPowerState
затем содержит строку "без присмотра", когда устройство выключено, например, пользователем, нажимающим кнопку выключения - В этом переходе просто позвоните
SystemIdleTimerReset()
сказать устройству не выключаться - Повторите, когда переход происходит снова
- При выключении звоните
PowerPolicyNotify()
чтобы выйти из режима без присмотра, отпустите все устройства сReleasePowerRequirement()
и прекратить получать уведомления о мощности сStopPowerNotifications()
,