Как я могу запустить код на Windows Mobile во время приостановки?

Я хотел бы запустить некоторый код C ++, пока Windows Mobile PocketPC приостановлен (или кажется) приостановлен. В качестве примера я имею в виду подключаемый модуль HTC Home, который показывает (среди прочего) вкладку, где можно использовать HTC Audio Manager для воспроизведения файлов mp3. Когда я нажимаю кнопку включения / выключения, дисплей становится черным, но звук продолжает воспроизводиться. Единственная кнопка, которую можно снова включить, - это кнопка включения / выключения, как и ожидалось.

До сих пор я пробовал фиксировать нажатия аппаратных кнопок (работает) и выключать отображение видео (работает). Что не работает с этим подходом, так это то, что при (случайном) нажатии любой клавиши на устройстве включается видеодисплей. Я думаю, что это не тот подход, который используется в HTC Audio Manager.

Я предполагаю, что это сработает на каком-то низкоуровневом API-интерфейсе, или что код для воспроизведения звука работает на каком-то уровне прерывания, или устройство переходит в другой режим ожидания.


person vividos    schedule 03.12.2008    source источник


Ответы (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().
person vividos    schedule 27.05.2009

Сначала взгляните на эту запись в блоге в чтобы понять различные состояния питания. Что вам в основном нужно, так это принудительно установить состояние ScreenOff. Взгляните на функцию SetSystemPowerState.

person kgiannakakis    schedule 03.12.2008
comment
Работает, вызываю SetSystemPowerState (NULL, POWER_STATE_IDLE, 0); К сожалению, любая нажатая клавиша пробуждает систему, а не только кнопка включения / выключения, как описано в записи блога. - person vividos; 18.12.2008