Existe-t-il des considérations particulières pour un service Windows pour l'envoi de messages aux fenêtres utilisateur?

StackOverflow https://stackoverflow.com/questions/615195

Question

Je dois écrire une application de service Windows (sans interface graphique) qui surveillera un événement et, le cas échéant, enverra un message Windows standard à une application. Le descripteur de l'application sera attribué au service par une DLL qui sera ensuite déchargée. Un message Windows correspond donc à l'utilisation que nous souhaitons.

Cependant, la question est de savoir si le service doit faire quelque chose de spécial pour utiliser SendMessage sur le descripteur de fenêtre, étant donné qu'il peut se trouver sur un autre écran ou quelque chose dans Vista. Est-ce possible, et si oui, que dois-je faire s'il vous plaît?

Était-ce utile?

La solution

Isolation des privilèges d'interface utilisateur (UIPI):

  

Microsoft Windows Vista et versions ultérieures.   L'envoi du message est soumis à l'utilisateur   Isolation de privilèges d'interface (UIPI).   Le fil d'un processus peut envoyer   messages uniquement aux files de messages de   discussions dans les processus de moindre ou   niveau d'intégrité égal.

Source

Vous pouvez en savoir plus sur Isolation des privilèges d'interface utilisateur (UIPI) ici .

Pour résoudre ce problème, vous pouvez définir uiAccess sur true dans votre fichier manifeste. Vous devez également vous assurer que votre application est signée en utilisant authenticode avec un certificat d'une autorité de signature telle que VeriSign. Cela peut devenir assez cher.

Isolement de la session 0:

J’estime également que vous ne pouvez pas appeler SendMessage d’une session à l’autre. Ainsi, si vous avez un service en cours d'exécution dans la session 0, vous devez trouver un autre moyen de communiquer avec votre processus qui s'exécuterait dans une session > 0. Exemple: via un tuyau.

Sous Windows Vista, Windows 2008 Server et les versions ultérieures, tous les services s'exécutent dans la session 0, ainsi que toutes les applications que vous démarrez dans la session > 0. Ceci s'appelle l'isolement de la session 0. Voici un bon document contenant des informations relatives à l'isolement de la session 0 .

Si vous n'avez pas accès à la source du programme auquel vous souhaitez envoyer des messages, vous pouvez contourner le problème en créant une application qui communique avec votre service et joue le rôle de proxy pour relayer le message à l'application en sa même session.

Dans l'ensemble:

Si vous développez votre application sur les versions antérieures à Vista et que cela fonctionne correctement. Il y a une très forte chance qu'il soit cassé sous Vista.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top