Программно отменяем выключение КПК и подсветки в 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 [40.37 Kb] (cкачиваний: 4)