2008-12-03 12 views
2

Je voudrais exécuter du code C++ pendant que Windows Mobile PocketPC est (ou semble) suspendu. Un exemple de ce que je veux dire est le plugin HTC Home qui montre (entre autres) un onglet où le gestionnaire audio HTC peut être utilisé pour lire des fichiers mp3. Lorsque j'appuie sur le bouton marche/arrêt, l'affichage devient noir, mais l'audio continue de jouer. Le seul bouton à rallumer est le bouton marche/arrêt, comme prévu.Comment puis-je exécuter du code sur Windows Mobile en étant suspendu?

Ce que j'ai essayé jusqu'ici est de capturer des appuis de bouton matériel (fonctionne) et d'éteindre l'affichage vidéo (fonctionne). Ce qui ne fonctionne pas avec cette approche est que lorsque vous appuyez sur une touche de l'appareil (accidentellement), l'affichage vidéo est activé. Je pense que ce n'est pas l'approche adoptée dans le HTC Audio Manager. Je suppose que certaines fonctionnalités de l'API de bas niveau fonctionnent, ou que le code de lecture de l'audio s'exécute à un certain niveau d'interruption ou que l'appareil passe en mode suspension différent.

Répondre

4

J'ai trouvé le code source sur le xda-developers forum qui explique ce qu'il faut faire, et cela fonctionne comme une pensée. Les principaux points sont les suivants:

  • Définissez l'appareil pour qu'il envoie une notification lorsqu'il passe en mode "sans surveillance". Cela est fait avec PowerPolicyNotify(PPN_UNATTENDEDMODE, TRUE)
  • Pour chaque périphérique dont vous avez besoin en mode sans assistance, appelez SetPowerRequirement(L"gpd0:", D0, POWER_NAME|POWER_FORCE, NULL, NULL); Le périphérique "gpd0:" est le pilote GPS Intermediate; remplacer ou dupliquer un appel avec tout périphérique dont vous avez besoin, par ex. "Wav1:" pour l'audio, "DSK1:" pour carte mémoire ou "com1:" pour le port série 1.
  • Créer une file d'attente de messages et demander des notifications de puissance à l'aide RequestPowerNotifications(hMsgQueue, PBT_POWERINFOCHANGE | PBT_TRANSITION)
  • Chaque fois qu'une notification de puissance est envoyé, le message la file d'attente est remplie avec une structure de type POWER_BROADCAST.
  • Rechercher le type de message PBT_TRANSITION. Le champ pPwrBrodcast->SystemPowerState contient alors une chaîne "sans surveillance" lorsque le dispositif est éteint, par ex. par l'utilisateur en appuyant sur le bouton off
  • Dans cette transition, il suffit d'appeler SystemIdleTimerReset() pour dire au dispositif de ne pas fermer
  • Répéter lorsque la transition se produit à nouveau
  • Lors de l'arrêt, appelez PowerPolicyNotify() pour quitter le mode sans surveillance, relâchez tout appareils avec ReleasePowerRequirement() et cesser de recevoir des notifications de puissance avec StopPowerNotifications().
1

Pour commencer, jetez un oeil à ce blog entry afin de comprendre les différents états de puissance. Ce dont vous avez essentiellement besoin est de forcer l'état ScreenOff. Jetez un oeil à la fonction SetSystemPowerState.

+0

Cela fonctionne, j'appelle SetSystemPowerState (NULL, POWER_STATE_IDLE, 0); Malheureusement, n'importe quelle touche enfoncée réveille le système, pas seulement le bouton marche/arrêt, comme décrit dans l'entrée de blog. – vividos

Questions connexes