Обзоры и статьи / Программная перезагрузка КПК и управление питанием дисплея

Программная перезагрузка КПК и управление питанием дисплея


Зачастую приходится прибегать к программной перезагрузке устройств под управлением Windows Mobile. Существует два вида перезагрузок – мягкая (soft reset) и жесткая перезагрузка (hard reset). При мягкой перезагрузке оперативная память обнуляется. Пользователю это грозит потерей данных, которые он только что ввел в приложении, но не успел сохранить. При этом область, в которой хранятся программы и сохраненные данные (на Windows Mobile 4.2 эта область памяти называется Object Store) не страдает. Hard reset менее щепетилен, он полностью стирает оперативную память и возвращает КПК к заводским установкам.
Мягкую перезагрузку можно сделать, используя специальную кнопку. Примером тому могут служить многочисленные устройства от российской компании Rover и некоторых других производителей. С hard reset-ом ситуация значительно сложнее. Для жесткой перегрузки необходимо нажимать специальную, зачастую очень сложную комбинацию клавиш, уникальную для каждого устройства.
При разработке приложений иногда удобно использовать мягкую перезагрузку и уметь включать и выключать дисплей, для экономии энергии аккумулятора (например, при написании проигрывателя, во время прослушивания музыкальных композиций).
Эта задача является совсем не сложной, если знать, что за управлением питанием КПК отвечает специальная функция SetSystemPowerState(), а за перезагрузку - KernelIoControl(). Обе функции гарантированно входят в состав WinAPI для Windows Mobile 4.2 и выше.

Для начала необходимо сделать обертку этих функций. Для этого пишем wrapper каждой функции.

#region Platform methods[DllImport("Coredll.dll",             EntryPoint = "SetSystemPowerState",             CharSet = CharSet.Unicode)]private extern static void _SetSystemPowerState(    uint systemState,    uint stateFalgs,    uint options);[DllImport("Coredll.dll",     EntryPoint = "SetCleanRebootFlag",     CharSet = CharSet.Unicode)]private extern static void _SetCleanRebootFlag();[DllImport("Coredll.dll",     EntryPoint = "KernelIoControl",     CharSet = CharSet.Unicode)]public extern static uint _KernelIoControl(    uint dwIoControlCode,    IntPtr lpInBuf,    uint nInBufSize,    IntPtr lpOutBuf,    uint nOutBufSize,    ref uint lpBytesReturned);#endregion


Функция SetSystemPowerState() необходима для управления питанием устройства. SetCleanRebootFlag() перегружает Object Store устройства, т.е. ее необходимо вызывать для выполнения жесткой перезагрузки КПК. Функция KernelIoControl() может осуществлять огромное количество различных действий. При обращении к ней с определенными значениями параметров можно осуществлять различные виды перезагрузки КПК. Для использования этих функций необходимо описать несколько констант:

#region Public constantspublic const uint FILE_DEVICE_HAL  = 0x00000101;public const uint METHOD_BUFFERED  = 0;public const uint FILE_ANY_ACCESS  = 0;public const uint POWER_STATE_ON   = 0x00010000;public const uint POWER_STATE_IDLE = 0x00100000;#endregion


Далее рассмотрим функции, которые будут осуществлять перезагрузку устройств и управлять питанием дисплея.

#region Public methods// Функция перезагрузки КПКpublic uint ResetPocketPC(bool hardReset){    uint bytesReturned = 0;    uint IOCTL_HAL_REBOOT = _CtlCode(FILE_DEVICE_HAL,       15, METHOD_BUFFERED, FILE_ANY_ACCESS);    if (hardReset)        _SetCleanRebootFlag();    return _KernelIoControl(IOCTL_HAL_REBOOT,         IntPtr.Zero, 0, IntPtr.Zero, 0,         ref bytesReturned);}// Выключение подсветки экранаpublic void TurnScreenOff(){    _SetSystemPowerState(0, POWER_STATE_IDLE, 0);}// Включение подсветки экранаpublic void TurnScreenOn(){    _SetSystemPowerState(0, POWER_STATE_ON, 0);}#endregion


Функция ResetPocketPC() перегружает устройство. Параметр hardReset определяет тип перезагрузки. Мягкая, если он равен false и соответственно жесткая, если true.
Функция TurnScreenOff() выключает питание экрана. Для этого используется WinApi’шная SetSystemPowerState(), с параметром, значение которого равно POWER_STATE_IDLE - отключить питание дисплея.
TurnScreenOn() включает питание экрана. Она использует ту же SetSystemPowerState(), только с параметром, значение которого должно быть POWER_STATE_ON.
Функция _CtlCode(), использованная в ResetPocketPC() осуществляет битовые сдвиги, необходимые для формирования управляющего слова. Код функции следующий:

#region Private methodsprivate uint _CtlCode(uint deviceType, uint function,     uint method, uint access){    return ((deviceType << 16) | (access << 14) |             (function << 2) | method);}#endregion


Да и напоследок, я чтото так и непонял как из этого зделать .cab, .ехе или .lnk. Может кто-нибудь поможет и напишет здесь?

Пример к статье можно скачать

Скачать / Download [46.76 Kb]

Системные требования: Нет данных
Оф. сайт/Источник: http://www.gotdotnet.ru/
Как бесплатно качать с файлообменников

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
  1. Блин народ помогите!Как дурак сижу и незнаю что делать....установил 6.1 винду,а снести немогу!!!
    И вот че теперь делать?ибо надо.....
  1. как говорится, если хочешь, чтобы всё было хорошо - сделай это сам!
  1. isitme,

    Спасибо. thumbup Надеюсь это не Харт Резет. question
  1. те, кто в силах написать нормальный плеер и управлять питанием устройства смогут спокойно.
  1. ну думается тем кто захочет например свой плеер написать это понадобится.. ну и так далее
  1. и нафига? помоему есть такие вещи как sktools... писать то, что уже реализованно лучше...
  1. нипонятно ! так оно реализовано уже! Во многи прогах
  1. Да и напоследок, я чтото так и непонял как из этого зделать .cab, .ехе или .lnk. Может кто-нибудь поможет и напишет здесь?

    Вызываем функцию при запуске приложения. angry
  1. Да и напоследок, я чтото так и непонял как из этого зделать .cab, .ехе или .lnk. Может кто-нибудь поможет и напишет здесь?


    windows-mobile-power-managment.rar\Windows Mobile power managment\PowerManagment\PowerManagment\bin\Release\Shu
    tDowndotNet.exe