2009-03-05 7 views
1

Ich muss eine Windows-Dienstanwendung (keine GUI) schreiben, die ein Ereignis überwachen wird, und wenn es auftritt, wird eine Standard-Windows-Nachricht an eine Anwendung senden. Das Handle der Anwendung wird dem Dienst von einer DLL übergeben, die dann entladen wird, so dass eine Windows-Nachricht die Art und Weise ist, die wir verwenden möchten.Gibt es spezielle Überlegungen für einen Windows-Dienst, um Nachrichten an Benutzerfenster zu senden?

Die Frage ist jedoch, ob der Dienst etwas Besonderes tun muss, um SendMessage für das Fensterhandle zu verwenden, da es sich möglicherweise auf einem anderen Bildschirm oder etwas in Vista befindet. Ist das möglich und wenn ja, was muss ich tun?

Antwort

7

User Interface Privilege Isolation (UIPI):

Microsoft Windows Vista und höher. Das Senden von Nachrichten unterliegt dem Benutzer Interface Privilege Isolation (UIPI). Der Thread eines Prozesses kann Nachrichten nur an Nachrichtenwarteschlangen von Threads in Prozessen von kleineren oder gleichen Integritätslevel senden.

Source

können Sie über User Interface Privilege Isolation (UIPI) here lesen.

Um dies zu umgehen, können Sie uiAccess in Ihrer Manifest-Datei auf true setzen. Sie müssen auch sicherstellen, dass Ihre Anwendung mit authenticode mit einem Zertifikat von einer Zertifizierungsstelle wie VeriSign signiert ist. Das kann ziemlich teuer werden.


Session 0 Isolation:

Es ist auch meine Überzeugung, dass Sie nicht Sendmessage über mehrere Sitzungen aufrufen können. Wenn also ein Dienst in Sitzung 0 ausgeführt wird, müssen Sie eine andere Möglichkeit finden, um mit Ihrem Prozess zu kommunizieren, der in einer Sitzung> 0 ausgeführt wird. Beispiel: via Pipe.

In Windows Vista, Windows 2008 Server und höher werden alle Dienste in Sitzung 0 ausgeführt, und alle Anwendungen, die Sie starten, werden in Sitzung> 0 ausgeführt. Dies wird Sitzung 0-Isolierung genannt. Hier ist ein gutes Dokument, das information all about session 0 isolation hat.

Wenn Sie keinen Zugriff auf die Quelle des Programms haben, an das Sie Nachrichten senden möchten, können Sie dies umgehen, indem Sie eine Anwendung erstellen, die mit Ihrem Dienst kommuniziert und als Proxy die Nachricht an die Anwendung weiterleitet in derselben Sitzung.


Gesamt:

Wenn Sie Ihre Anwendung auf Pre-Vista entwickeln und es funktioniert gut. Es gibt eine sehr hohe Chance, dass es in Vista gebrochen wird.

+0

Egal ob es richtig ist oder nicht, das sind gute Informationen. –

+0

Das klingt schlecht. Klarstellung: Ich weiß nicht genug über das Thema, um zu wissen, ob das hilfreich ist oder nicht, aber ich finde, dass die Information allgemein nützlich ist, also gab ich ihr +1. –

+0

:) Danke, ich denke, das Poster wird beide Probleme haben. Aber ich habe auch nicht die genauen Einzelheiten seines Problems. –

Verwandte Themen