/ / Windows Mobile - Vypnúť vypínač - windows-mobile, windows-mobile-5.0

Windows Mobile - vypnutie napájacieho tlačidla - windows-mobile, windows-mobile-5.0

Zachytil niekto úspešne tlačidlo napájania / pohotovostného režimu na zariadení WM5 tak, že váš kód zabránil používateľom „vypnúť“ dokonca aj obrazovku?

Mám aplikáciu, ktorá používa obrazovku v aorientácia na šírku a chcel by som zachytiť stlačenie vypínača, aby (a) používatelia mohli zariadenie držať oboma rukami a omylom nevypnúť obrazovku a (ako bonus - b) použiť ho ako tlačidlo používateľského rozhrania.

Možno má niekto hack na nízkej úrovni? Používam program WM5 dodávaný na zariadeniach iPaq RX1950.

Pamätajte, že existuje nič také ako nemožné - najmä s WM5. Ak si medzitým na ňu odpoviem sám, aktualizujem otázku.


Aktualizovať!

Objavil som tri triky, ktoré fungujú v opačnom poradí podľa použiteľnosti:

  1. Oprava keybddr.dll (na tomto zariadení), opätovné vloženie do ROM pomocou vašich obľúbených prostriedkov. Na tomto zariadení s touto továrenskou ROM - to funguje, ale nechcel som to natrvalo deaktivovať.

  2. Synchronizujte do frontu správ správy napájania a zapnite zariadenie vždy, keď hovorí, že klesá.

  3. Zmeňte "Stav napájania" v registri taksú „všetci (väčšina z nich)“ zapnutí. „Týmto spôsobom môžem pomocou rozhrania RAPI deaktivovať tlačidlo napájania a nechať softvér v zariadení„ resetovať “register pri udalostiach x, yaz.

odpovede:

3 pre odpoveď č. 1

Implementácia tlačidla napájania je OEMzávislé, takže riešenie na jednom zariadení pravdepodobne nebude fungovať na inom zariadení. Kvôli širokej škále implementácií v zariadeniach so systémom Windows Mobile zistíte, že je to pravda pri mnohých funkciách na nízkej úrovni.

Alternatíva spočíva v kombinácii vecí

  • Spustite aplikáciu v bezobslužnom režime
  • Monitorujte udalosti zmeny napájania
  • keď sa zariadenie prepne do bezobslužného režimu, vyžiada si plný režim

Úplná diskusia o správe napájania je nad rámec toho, o čom tu môžem diskutovať. Viac sa dočítate tu: http://www.codeproject.com/KB/mobile/WiMoPower1.aspx

Tu je tiež ukážka, ktorá ukazuje, ako sa dá zaregistrovať na udalosti napájania: http://www.codeproject.com/KB/mobile/WiMoQueue.aspx


0 pre odpoveď č. 2

Nasledujúci kód nezruší tlačidlo napájania, ale ak je zariadenie vypnuté, do 10 sekúnd ho znova zapne. Zakáže tiež všetky funkcie úspory energie.

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
}
}