2009-05-17 7 views
2

J'ai une application Windows Mobile simple qui enregistre les coordonnées GPS toutes les 5 minutes. Le problème est que l'application fonctionne bien tant que l'écran est activé, dès que le téléphone passe en mode veille, l'application cesse de fonctionner. Lorsque j'allume l'appareil, l'application recommence à fonctionner.Laisser l'application Windows Mobile s'exécuter en mode veille

Que dois-je faire pour que l'application fonctionne même en mode veille?

Sandeep

Répondre

4

Regardez la fonction CeRunAppAtTime. Passez-lui un événement nommé et l'heure à laquelle vous souhaitez l'exécuter. Attendez l'événement dans un fil. Vous voudrez appeler PowerPolicyNotify lorsque vous vous réveillerez, sinon le périphérique pourrait se suspendre à nouveau avant de terminer.

Le code ressemblerait à quelque chose comme ça

CeRunAppAtTime(eventName,now + 5 minutes) 
while(!quit) 
WaitForSingleObject(event,timeout) 
PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE) 
DoGpsStuff() 
CeRunAppAtTime(eventName,now + 5 minutes) 
PowerPolicyNotify(PPN_UNATTENDEDMODE,FALSE) 
6

Mon expérience avec le GPS est qu'il faut un certain temps pour obtenir une solution (au moins sur mon appareil), donc je pense que vous devez garder le téléphone de état suspendu tout le temps. Quand j'ai joué avec mon appareil, j'ai remarqué que je devais utiliser le lecteur de musique intégré pour obtenir une solution lorsque l'écran est éteint. Comme Ratchetr a souligné PowerPolicyNotify (PPN_UNATTENDEDMODE, TRUE) semble être le bon moyen d'empêcher le "lecteur de musique requis". Edit: Il semble également que vous devez utiliser SetPowerRequirement/ReleasePowerRequirement sur certains périphériques.

Voici un exemple C#:

public const int PPN_UNATTENDEDMODE = 0x0003; 
    public const int POWER_NAME = 0x00000001; 
    public const int POWER_FORCE = 0x00001000; 

    [DllImport("coredll.dll")] 
    public static extern bool PowerPolicyNotify(int dwMessage, bool dwData); 

    [DllImport("coredll.dll", SetLastError = true)] 
    public static extern IntPtr SetPowerRequirement(string pvDevice, CedevicePowerStateState deviceState, uint deviceFlags, string pvSystemState, ulong stateFlags); 

    [DllImport("coredll.dll", SetLastError = true)] 
    public static extern int ReleasePowerRequirement(IntPtr hPowerReq); 

    public enum CedevicePowerStateState : int 
    { 
     PwrDeviceUnspecified = -1, 
     D0 = 0, 
     D1, 
     D2, 
     D3, 
     D4, 
    } 

    //Keep the GPS and device alive: 
    PowerPolicyNotify(PPN_UNATTENDEDMODE, true) 
    IntPtr gpsPowerHandle = SetPowerRequirement("gpd0:", CedevicePowerStateState.D0, POWER_NAME | POWER_FORCE, null, 0); 

    //Call before exiting your app: 
    ReleasePowerRequirement(gpsPowerHandle); 
    PowerPolicyNotify(PPN_UNATTENDEDMODE, false); 
+0

la réponse la plus claire sur le web !!! ça marche super .. j'ai remarqué qu'il garde le wifi. – GorillaApe

Questions connexes