Как запустить код в Windows Mobile, пока он приостановлен? - PullRequest
2 голосов
/ 03 декабря 2008

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

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

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

Ответы [ 2 ]

4 голосов
/ 27 мая 2009

Я нашел исходный код на форуме xda-developers , который объясняет, что делать, и работает как задумано. Основные моменты:

  • Настройка устройства на отправку уведомления при переходе в «автоматический» режим. Это сделано с 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().
1 голос
/ 03 декабря 2008

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

...