Pergunta

Alguém preso com sucesso o botão de energia / espera em um dispositivo WM5 tais que seu código impediu os usuários "desligar" até mesmo a tela?

Eu tenho um aplicativo que usa a tela em uma orientação paisagem e eu gostaria de prender a imprensa tecla de alimentação de modo que (a) os usuários podem manter o dispositivo com ambas as mãos e não acidentalmente desligamento da tela e (como um bônus -. b) usá-lo como um botão UI

Talvez alguém tem um corte de baixo nível? Estou usando WM5 como emitido em iPaq rx1950 (s).

Lembre-se, há existe tal coisa como impossível - especialmente com WM5. Se eu responder-me, entretanto, eu vou atualizar a questão.


Update!

Eu descobri três truques que o trabalho, em ordem inversa de usabilidade:

  1. patch keybddr.dll (neste dispositivo), re-injetar na ROM através de seus meios favoritos. Nesta dispositivo com esta ROM da fábrica - ele funciona, mas eu não queria permanentemente desativá-lo

  2. .
  3. Sync para a fila de mensagens de gestão de energia e ligar o dispositivo "on" sempre que ele diz que está indo para baixo.

  4. Alterar a "Estados de energia" no registro para que eles estejam todos (a maioria deles) "on". Dessa forma, eu posso usar RAPI para desativar o botão de energia e ter o software no "reset" dispositivo de registo no evento x, y e z.

Foi útil?

Solução

A implementação do botão de energia é OEM dependente, por isso uma solução em um dispositivo não é susceptível de trabalho em outro dispositivo. Devido à grande variação de implementações em dispositivos Windows Mobile você encontrará isso é verdade com muitas características de baixo nível.

A alternativa envolve uma combinação de coisas

  • Execute o aplicativo no modo autônomo
  • Monitor para eventos de alteração de potência
  • quando o dispositivo muda para solicitação de modo automático completo sobre o modo

Uma discussão completa de gerenciamento de energia está além do que eu posso discutir aqui. Você pode ler mais sobre isso aqui: http://www.codeproject.com/KB/mobile/WiMoPower1.aspx

Há também um exemplo que mostra como se pode registrar para eventos poder aqui: http://www.codeproject.com/KB/mobile/WiMoQueue.aspx

Outras dicas

O código a seguir não vai desativar o botão de energia, mas se o dispositivo estiver desligado, ele vai virar as costas dispositivo novamente dentro de 10 segundos. Ele também irá desativar qualquer funcionalidade de economia de energia.

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
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top