Windows Mobile - обнаружение при нажатии кнопки выключения - PullRequest
2 голосов
/ 25 февраля 2010

Существует ли простой способ получать уведомления, когда пользователь нажимает кнопку выключения на устройстве Windows Mobile? Конечно, используя C #.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Когда кнопка питания нажата, диспетчер питания отправит уведомление об изменении состояния. Вы можете запросить, чтобы PM отправил вам уведомление, позвонив по номеру RequestPowerNotifications Вы должны отправить дескриптор в очередь сообщений типа точка-точка (управляемая версия здесь ) который получит уведомление.

Для тех, кто не хочет писать весь клей, чтобы сделать эту работу, все это уже сделано для вас в классе SDM PowerManagement .

Также имейте в виду, что только если вы запросите уведомление, не означает, что ваше приложение получит уведомление до того, как произойдет изменение состояния. Например, в pwer down довольно часто приложение не увидит уведомление, и почти наверняка, даже если вы его увидите, у вас не будет времени на выполнение чего-либо до того, как фактически произойдет приостановка. Обычно ваш обработчик запускается, когда устройство возобновляет работу (за ним следует любой обработчик состояния возобновления).

Менеджер питания не ждет вас, он просто передает сообщение. Вы не можете использовать это для запуска кода перед выключением.

1 голос
/ 14 ноября 2011

Я просто помещаю CreateMsgQueue () в двоичные файлы RPM XIP без необходимости в исходном коде или помощи OEM. вам нужно использовать шестнадцатеричный редактор и несколько инструментов с форумов XDA.

<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function CreateMsgQueue(ByVal lpszName As String, ByVal lpOptions As MsgQueueOptions) As IntPtr
End Function

также вам нужно просто создать простой драйвер для блокировки события отключения питания, ваш драйвер может задерживать процесс отключения питания в событии устройства PowerDown. таким образом вы получите гарантированное событие, которое вы можете установить флаг и остановить фоновый процесс, а также сохранить любые переменные, а затем восстановить их по событию PowerUp, которое также является стандартным событием evc ++ для драйвера устройства winCE. Довольно просто на самом деле. Для этого в Интернете есть сотни демонстрационных исходных кодов, я видел их на сотнях сайтов.

0 голосов
/ 01 июля 2010

К сожалению, на устройстве Windows CE 6, которое я использую, CreateMsgQueue не существует в CoreDll. Любые другие предложения?

Единственное, о чем я могу думать, это постоянно проверять Environment.TickCount по часам реального времени устройства. Если время двигалось вперед, но не тиковое число, то, вероятно, устройство спало.

Не нравится это решение, потому что оно будет обмануто, если время изменится из-за сбоя в часах реального времени устройства

...