Windows Mobile — отключить кнопку питания
-
03-07-2019 - |
Вопрос
Кто-нибудь успешно заблокировал кнопку питания/ожидания на устройстве WM5 так, чтобы ваш код не позволял пользователям «выключать» даже экран?
У меня есть приложение, которое использует экран в альбомной ориентации, и я хотел бы перехватить нажатие клавиши питания, чтобы (а) пользователи могли держать устройство обеими руками и случайно не выключать экран и (в качестве бонуса - б) используйте его как кнопку пользовательского интерфейса.
Возможно у кого-то есть низкоуровневый хак?Я использую WM5, поставляемую на iPaq RX1950(s).
Помните, есть нет такого понятия, как невозможное - особенно с WM5.Если я тем временем отвечу на него сам, я обновлю вопрос.
Обновлять!
Я обнаружил три работающих трюка в порядке, обратном удобству использования:
Пропатчить keybddr.dll (на этом устройстве), переинжектировать в ПЗУ любимыми способами.На этом аппарате с этим заводским ПЗУ - работает, но отключать навсегда не хотелось.
Синхронизируйтесь с очередью сообщений управления питанием и включайте устройство всякий раз, когда оно сообщает, что оно выходит из строя.
Измените «Состояния электропитания» в реестре, чтобы они все (большинство из них) были «включены».Таким образом, я могу использовать RAPI, чтобы отключить кнопку питания и заставить программное обеспечение на устройстве «сбросить» реестр при событиях x, y и z.
Решение
Реализация кнопки питания зависит от OEM-производителя, поэтому решение на одном устройстве вряд ли будет работать на другом устройстве.Из-за большого разнообразия реализаций на устройствах Windows Mobile вы обнаружите, что это справедливо для многих функций низкого уровня.
Альтернатива предполагает сочетание вещей
- Запустите приложение в автоматическом режиме
- Мониторинг событий изменения мощности
- когда устройство переходит в автоматический режим, запрашивает режим полного включения
Полное обсуждение управления питанием выходит за рамки того, что я могу обсудить здесь.Вы можете прочитать больше об этом здесь:http://www.codeproject.com/KB/mobile/WiMoPower1.aspx
Здесь также есть образец, показывающий, как можно зарегистрироваться на энергетические мероприятия:http://www.codeproject.com/KB/mobile/WiMoQueue.aspx
Другие советы
Следующий код не отключит кнопку питания, но если устройство выключено, оно снова включится в течение 10 секунд.Это также отключит все функции энергосбережения.
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;
namespace Core.Mobile
{
/// <summary>
/// Allows manipulation the power management i.e. system standby
/// </summary>
public static class PowerManipulation
{
#region Private variables
private static System.Threading.Timer _timer = null;
private const int INTERVAL = 10000; //10 seconds
#endregion
#region Public methods
/// <summary>
/// Prevents the application from suspending/sleeping
/// </summary>
public static void DisableSleep()
{
if (_timer == null)
{
_timer = new System.Threading.Timer(new System.Threading.TimerCallback(Timer_Tick), null, 0, INTERVAL);
}
try
{
PowerPolicyNotify(PPN_UNATTENDEDMODE, 1); //Ensure the application still runs in suspend mode
}
catch { }
}
/// <summary>
/// Allows suspend/sleep operations
/// </summary>
public static void EnableSleep()
{
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
try
{
PowerPolicyNotify(PPN_UNATTENDEDMODE, 0);
}
catch { }
}
#endregion
#region Private methods
/// <summary>
/// Internal timer for preventing standby
/// </summary>
private static void Timer_Tick(object state)
{
try
{
SystemIdleTimerReset();
SetSystemPowerState(null, POWER_STATE_ON, POWER_FORCE);
}
catch { }
}
#endregion
#region PInvoke
private const int PPN_UNATTENDEDMODE = 0x00000003;
private const int POWER_STATE_ON = 0x00010000;
private const int POWER_STATE_OFF = 0x00020000;
private const int POWER_STATE_SUSPEND = 0x00200000;
private const int POWER_FORCE = 4096;
private const int POWER_STATE_RESET = 0x00800000;
/// <summary>
/// This function resets a system timer that controls whether or not the
/// device will automatically go into a suspended state.
/// </summary>
[DllImport("CoreDll.dll")]
private static extern void SystemIdleTimerReset();
/// <summary>
/// This function resets a system timer that controls whether or not the
/// device will automatically go into a suspended state.
/// </summary>
[DllImport("CoreDll.dll")]
private static extern void SHIdleTimerReset();
/// <summary>
/// This function allows the current power state to be manipulated, i.e. turn the device on
/// </summary>
[DllImport("coredll.dll", SetLastError = true)]
static extern int SetSystemPowerState(string psState, int StateFlags, int Options);
/// <summary>
/// This function sets any power notification options
/// </summary>
[DllImport("CoreDll.dll")]
static extern bool PowerPolicyNotify(int dwMessage, int onOrOff);
#endregion
}
}