Программно отменяем выключение КПК и подсветки в Win Mobile на C#

Наверное многие сталкивались с этой проблемой, когда написанное приложение хорошо и замечательно работает, до тех пор пока КПК не уйдёт в спящий режим. Либо когда необходимо долго не прикасаясь к экрану карманного компьютера хорошо и чётко видеть что у него на экране (в случае например если вы делаете что-то своё для навигации, а почему бы и нет) а устройство спустя секунд 20-30 выключает подсветку экрана. Вот и я столкнулся с такой проблемой и необходимостью заставить устройство не выключаться не при каких условиях, пока я этого не захочу, либо не сядут аккумуляторы.

Итак, сам класс для запрета отключения КПК и подсветки:
static class PowerControl
    {
        private const int POWER_NAME = 0x00000001;
        internal sealed class PowerMethods
        {
            //Для отмены автовыключения...
            [DllImport("coredll.dll")]
            internal extern static void SystemIdleTimerReset();

            //Для отмены выключения подсветки экрана...
            [DllImport("coredll.dll", SetLastError = true)]
            internal extern static int SetDevicePower(
                    string pvDevice,
                    int dwDeviceFlags,
                    DevicePowerState DeviceState
                );


        }

        //Здесь не вижу смысла переводить и так понятно - перечень состояний...
        public enum DevicePowerState : int
        {
            Unspecified = -1,
            D0 = 0, // Full On: full power, full functionality
            D1, // Low Power On: fully functional at low power/performance
            D2, // Standby: partially powered with automatic wake
            D3, // Sleep: partially powered with device initiated wake
            D4, // Off: unpowered
        }
    }


Теперь о том, как этим классом пользоваться:

//Это делаем при выходе из программы      
private void menuItem2_Click(object sender, EventArgs e)
        {
            //Задаём обычный режим для подсветки, затем выходим из приложения.
            int POWER_NAME = 0x00000001;
            PowerControl.PowerMethods.SetDevicePower("BKL1:", POWER_NAME, PowerControl.DevicePowerState.Unspecified);
            Application.Exit();
        }

//Это делаем при загрузке приложения
private void Form1_Load(object sender, EventArgs e)
        {
            //Не даем выключить подсветку (по завершении приложения надо перевести в обычный режим)
            int POWER_NAME = 0x00000001;
            PowerControl.PowerMethods.SetDevicePower("BKL1:", POWER_NAME, PowerControl.DevicePowerState.D0);
            
            //Это таймер который вызывает процедуру что сбрасывает автовыключение (обнуляет счётчик поэтому надо повоторять постоянно).
            System.Threading.AutoResetEvent autoEvent     = new System.Threading.AutoResetEvent(true);
            System.Threading.TimerCallback tcb = new System.Threading.TimerCallback(ProcessTimerEvent);
            //Интервалы такие большие поскольку не имеет смысла вызывать процедуру чаще чем это следует делать.
            System.Threading.Timer timer = new System.Threading.Timer(tcb, autoEvent, 18000, 9000);

        }

//Это сама процедура выполняемая по таймеру и сбрасывающая время до отклбючения.
private static void ProcessTimerEvent(object obj)
        {
            //сбрасываем выключение.
            PowerControl.PowerMethods.SystemIdleTimerReset();
        }


Вот и всё.

P.S.
Скачать пример с исходником можно здесь: DeviceDontShutDown.rar
  • 28 июня 2010, 10:47
  •      
  • Roman


Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.