Domanda

Qualcuno ha intrappolato con successo il pulsante di accensione / standby su un dispositivo WM5 in modo tale che il tuo codice abbia impedito agli utenti di "spegnere" anche lo schermo?

Ho un'applicazione che utilizza lo schermo in orientamento orizzontale e vorrei intercettare la pressione del tasto di accensione in modo che (a) gli utenti possano tenere il dispositivo con entrambe le mani e non spegnere accidentalmente lo schermo e (come un bonus - b) usalo come pulsante UI.

Forse qualcuno ha un hack di basso livello? Sto usando WM5 come consegnato su iPaq RX1950 (s).

Ricorda, non esiste nulla di impossibile , specialmente con WM5. Se rispondo io stesso nel frattempo, aggiornerò la domanda.


Aggiornamento!

Ho scoperto tre trucchi che funzionano, in ordine inverso di usabilità:

  1. Patch keybddr.dll (su questo dispositivo), reiniettarlo nella ROM con i tuoi mezzi preferiti. Su questo dispositivo con questa ROM di fabbrica, funziona, ma non volevo disabilitarlo permanentemente.

  2. Sincronizza con la coda dei messaggi di Risparmio energia e attiva il dispositivo " on " ogni volta che dice che sta andando giù.

  3. Modifica gli stati di alimentazione " nel registro, quindi sono tutti (la maggior parte di essi) " on " ;. In questo modo, posso utilizzare RAPI per disabilitare il pulsante di accensione e avere il software sul dispositivo "ripristina". il registro sull'evento x, ye z.

È stato utile?

Soluzione

L'implementazione del pulsante di accensione dipende dall'OEM, quindi è probabile che una soluzione su un dispositivo non funzioni su un altro dispositivo. A causa della grande varianza delle implementazioni nei dispositivi Windows Mobile, questo è vero con molte funzionalità di basso livello.

L'alternativa prevede una combinazione di cose

  • Esegui l'applicazione in modalità automatica
  • Monitora gli eventi di cambio alimentazione
  • quando il dispositivo passa alla modalità automatica, richiedere la modalità full on

Una discussione completa sulla gestione dell'alimentazione va oltre ciò di cui posso discutere qui. Puoi leggere di più qui: http://www.codeproject.com/KB/mobile/WiMoPower1.aspx

C'è anche un esempio che mostra come è possibile registrarsi per eventi di potenza qui: http://www.codeproject.com/KB/mobile/WiMoQueue.aspx

Altri suggerimenti

Il seguente codice non disabiliterà il pulsante di accensione, ma se il dispositivo è spento, lo riaccenderà entro 10 secondi. Disabiliterà anche qualsiasi funzionalità di risparmio energetico.

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
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top