1

有没有人成功地捕获了 WM5 设备上的电源/待机按钮,这样您的代码甚至阻止了用户“关闭”屏幕?

我有一个以横向使用屏幕的应用程序,我想捕获电源键按下,以便(a)用户可以用双手握住设备而不会意外关闭屏幕电源和(作为奖励 - b) 将其用作 UI 按钮。

也许有人有低级黑客?我使用的是 iPaq RX1950(s) 上提供的 WM5。

请记住,没有不可能的事情——尤其是对于 WM5。如果我同时自己回答,我会更新问题。


更新!

我发现了三个有效的技巧,按可用性的相反顺序:

  1. 修补 keybddr.dll(在此设备上),通过您喜欢的方式重新注入 ROM。在这个带有工厂 ROM 的设备上 - 它可以工作,但我不想永久禁用它。

  2. 同步到电源管理消息队列并在设备出现故障时将其“打开”。

  3. 更改注册表中的“电源状态”,使它们(大多数)都“打开”。这样,我可以使用 RAPI 禁用电源按钮,并让设备上的软件在事件 x、y 和 z 上“重置”注册表。

4

2 回答 2

3

电源按钮的实现取决于 OEM,因此一台设备上的解决方案不太可能在另一台设备上运行。由于 Windows Mobile 设备中的实现差异很大,您会发现许多低级功能都是如此。

替代方案涉及事物的组合

  • 在无人值守模式下运行您的应用程序
  • 监控电源变化事件
  • 当设备更改为无人值守模式时,请求完全开启模式

电源管理的完整讨论超出了我可以在这里讨论的范围。您可以在此处阅读更多信息:http: //www.codeproject.com/KB/mobile/WiMoPower1.aspx

还有一个示例显示如何在此处注册电源事件:http: //www.codeproject.com/KB/mobile/WiMoQueue.aspx

于 2009-04-29T15:56:49.953 回答
0

以下代码不会禁用电源按钮,但如果设备关闭,它将在 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
    }
}
于 2013-02-05T14:53:04.127 回答