Question

Quelqu'un at-il bloqué avec succès le bouton d'alimentation / veille d'un périphérique WM5, de sorte que votre code empêche les utilisateurs de "désactiver" " même l'écran?

Je dispose d’une application qui utilise l’écran en orientation paysage et je souhaite intercepter l’appui sur la touche marche / arrêt pour permettre aux utilisateurs de tenir l’appareil à deux mains et de ne pas éteindre accidentellement l’écran et un bonus - b) l'utiliser comme un bouton de l'interface utilisateur.

Peut-être que quelqu'un a un faible niveau de piratage? J'utilise WM5 tel que fourni sur les iPaq RX1950.

N'oubliez pas qu'il n'y a rien d'impossible , surtout avec WM5. Si je réponds moi-même entre-temps, je mettrai à jour la question.

Mettre à jour!

J'ai découvert trois astuces qui fonctionnent, dans l'ordre inverse d'utilisation:

  1. Corrigez keybddr.dll (sur ce périphérique), réinjectez-le dans la ROM via vos moyens favoris. Sur cet appareil avec cette ROM d’usine, cela fonctionne, mais je ne voulais pas la désactiver de manière permanente.

  2. Synchronisez avec la file de messages de la gestion de l'alimentation et allumez le périphérique " " chaque fois qu'il dit que ça va vers le bas.

  3. Modifiez les " Power States " dans le registre, ils sont donc tous (la plupart) "allumés". De cette manière, je peux utiliser RAPI pour désactiver le bouton d'alimentation et laisser le logiciel installé sur le périphérique " réinitialiser " le registre des événements x, y et z.

Était-ce utile?

La solution

L'implémentation du bouton d'alimentation dépend de l'OEM. Par conséquent, une solution sur un périphérique n'est pas susceptible de fonctionner sur un autre périphérique. En raison de la diversité des implémentations dans les appareils Windows Mobile, vous constaterez que cela est vrai avec de nombreuses fonctionnalités de bas niveau.

L’alternative implique une combinaison de choses

  • Exécutez votre application en mode sans assistance
  • Surveiller les événements de changement de puissance
  • lorsque le périphérique passe en mode sans assistance demande en mode complet

Une discussion complète sur la gestion de l’énergie va au-delà de ce que je peux discuter ici. Vous pouvez en lire plus à ce sujet ici: http://www.codeproject.com/KB/mobile/WiMoPower1.aspx

Un exemple montre également comment enregistrer des événements d'alimentation ici: http://www.codeproject.com/KB/mobile/WiMoQueue.aspx

Autres conseils

Le code suivant ne désactive pas le bouton d'alimentation, mais si le périphérique est éteint, il le rallumera dans les 10 secondes. Cela désactivera également toute fonctionnalité d'économie d'énergie.

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
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top