Windows Mobile - botão Desactivar Poder
-
03-07-2019 - |
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:
-
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
.
-
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.
-
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.
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
}
}