Как запустить код в 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(),

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

Другие вопросы по тегам