Disabilita la modalità di sospensione in Windows Mobile 6
-
05-07-2019 - |
Domanda
Qualcuno sa come posso disabilitare / abilitare a livello di programmazione la modalità di sospensione su Windows Mobile?
Grazie!
Soluzione
Se si desidera che il programma non venga messo in modalità di sospensione mentre è in esecuzione, il modo migliore è creare una funzione di tipo KeepAlive che chiama SystemIdleTimerReset, SHIdleTimerReset e simuli un tocco di tasto. Quindi devi chiamarlo molto, praticamente ovunque.
#include <windows.h>
#include <commctrl.h>
extern "C"
{
void WINAPI SHIdleTimerReset();
};
void KeepAlive()
{
static DWORD LastCallTime = 0;
DWORD TickCount = GetTickCount();
if ((TickCount - LastCallTime) > 1000 || TickCount < LastCallTime) // watch for wraparound
{
SystemIdleTimerReset();
SHIdleTimerReset();
keybd_event(VK_LBUTTON, 0, KEYEVENTF_SILENT, 0);
keybd_event(VK_LBUTTON, 0, KEYEVENTF_KEYUP | KEYEVENTF_SILENT, 0);
LastCallTime = TickCount;
}
}
Questo metodo funziona solo quando l'utente avvia l'applicazione manualmente.
Se l'applicazione viene avviata mediante una notifica (ovvero mentre il dispositivo è sospeso), è necessario fare di più, altrimenti l'applicazione verrà sospesa dopo un periodo di tempo molto breve fino a quando l'utente non spegne il dispositivo dalla modalità di sospensione . Per gestire questo è necessario mettere il dispositivo in modalità di alimentazione automatica.
if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE))
{
// handle error
}
// do long running process
if(!::PowerPolicyNotify (PPN_UNATTENDEDMODE, FALSE))
{
// handle error
}
Durante l'utilizzo in modalità automatica, è comunque necessario chiamare molto KeepAlive, è possibile utilizzare un thread separato che dorme per x millisecondi e chiama la funzione keep alive.
Si noti che la modalità automatica non la porta in modalità di sospensione, ma mette il dispositivo in uno strano stato semi-attivo.
Quindi, se si avvia una modalità automatica mentre il dispositivo è in modalità sospesa, non si riattiverà lo schermo o altro. Tutta la modalità automatica non fa altro che impedire a WM di sospendere l'applicazione. Inoltre, l'altro problema è che non funziona su tutti i dispositivi, alcuni dispositivi di gestione dell'alimentazione non sono molto buoni e ti sospenderanno comunque, qualunque cosa tu faccia.
Altri suggerimenti
Modifica le impostazioni del registro di Power Manager che influiscono sul sonno specifico condizione desiderata (timeout, pastella, alimentazione CA, ecc.) e SetEvent su un evento di sistema denominato denominato "PowerManager / ReloadActivityTimeouts" per dire al sistema operativo di ricaricare le impostazioni.
Probabilmente modificando gli "stati di alimentazione del sistema" come descritto qui (ma in c #)
Quell'articolo descrive anche un modo per impedire al dispositivo mobile di dormire (che non è esattamente quello che potresti desiderare), chiamando periodicamente la funzione nativa SystemIdleTimerReset () (per evitare che il dispositivo si spenga).