Domanda

Qualcuno sa come posso disabilitare / abilitare a livello di programmazione la modalità di sospensione su Windows Mobile?

Grazie!

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top