Frage

Hat jemand erfolgreich die Power / Standby-Taste auf einem WM5 Gerät gefangen, so dass der Code Benutzer verhindert „Ausschalten“, auch der Bildschirm?

Ich habe eine Anwendung, die den Bildschirm in einer Landschaft Orientierung verwendet und ich mag die Power-Taste drücken zu stoppen, so dass (a) Benutzer das Gerät mit beiden Händen halten können und nicht aus Versehen Power-Down-Bildschirm und (als ein Bonus -. b) es als UI-Taste verwenden

Vielleicht hat jemand ein niedriges Niveau hacken? Ich bin mit WM5 wie auf iPaq rx1950 geliefert (s).

Denken Sie daran, es ist nicht so etwas wie unmöglich - vor allem mit WM5. Wenn ich es mir in der Zwischenzeit zu beantworten, werde ich die Frage aktualisieren.


Aktualisieren Sie!

Ich entdeckte drei Tricks, die in umgekehrter Reihenfolge der Usability arbeiten:

  1. Patch keybddr.dll (auf diesem Gerät), erneut injiziert in das ROM über Ihre Lieblings-Mittel. Auf diesem Gerät mit diesem Werk ROM -. Es funktioniert, aber ich wollte nicht dauerhaft deaktivieren

  2. Sync an die Nachrichtenwarteschlange Power Management und schalten Sie das Gerät "auf", wenn er sagt, es geht nach unten.

  3. Ändern Sie den "Power States" in der Registrierung, so dass sie alle (die meisten von ihnen) "auf" beantragen. Auf diese Weise kann ich RAPI verwenden, um die Power-Taste zu deaktivieren und die Software auf dem Gerät „Reset“ die Registrierung auf Ereignis x, y und z.

War es hilfreich?

Lösung

Die Umsetzung der Power-Taste ist OEM abhängig, so dass eine Lösung auf einem Gerät nicht geeignet ist, auf einem anderen Gerät zu arbeiten. Wegen der großen Varianz von Implementierungen in Windows Mobile-Geräten finden Sie dies mit vielen Low-Level-Funktionen wahr.

Die Alternative ist eine Kombination von Dingen

  • Führen Sie Ihre Anwendung im unbeaufsichtigten Modus
  • Monitor für die Stromänderungsereignisse
  • , wenn das Gerät Änderungen an unbeaufsichtigter Modus Anforderung voll auf Modus

Eine vollständige Diskussion von Power-Management ist über das, was ich hier diskutieren kann. Hier können Sie mehr darüber lesen: http://www.codeproject.com/KB/mobile/WiMoPower1.aspx

Es gibt auch ein Beispiel, das zeigt, wie man hier für die Energie Veranstaltungen anmelden kann: http://www.codeproject.com/KB/mobile/WiMoQueue.aspx

Andere Tipps

Der folgende Code wird die Power-Taste nicht deaktiviert werden, aber wenn das Gerät ausgeschaltet ist, wird es das Gerät wieder einschalten innerhalb von 10 Sekunden drehen. Es wird auch jede Energiesparfunktionen deaktivieren.

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
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top