Gibt es spezielle Überlegungen für einen Windows -Dienst, um Nachrichten an Benutzer Windows zu senden?

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

Frage

Ich muss eine Windows -Service -Anwendung (keine GUI) schreiben, die ein Ereignis überwacht. Wenn sie auftritt, sendet eine Standard -Windows -Nachricht an eine Anwendung. Das Handle der Anwendung wird dem Dienst von einer DLL, die dann entladen wird, dem Dienst gegeben. Eine Windows -Nachricht ist also die Art und Weise, wie wir es verwenden möchten.

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

War es hilfreich?

Lösung

Benutzeroberflächen -Privilegisolation (UIPI):

Microsoft Windows Vista und später. Das Senden von Nachrichten unterliegt der UIPI -Isolation der Benutzeroberfläche (UIPI). Der Thread eines Prozesses kann Nachrichten nur an Nachrichtenwarteschlangen von Threads in Prozessen mit weniger oder gleicher Integritätsebene senden.

Quelle

Sie können darüber lesen Benutzeroberflächen -Privilegisolation (UIPI) hier.

Um dies zu umgehen, können Sie in Ihrer Manifest -Datei UIAccess auf wahr einstellen. Sie müssen auch sicherstellen, dass Ihre Bewerbung mit einem Authenticode mit einem Zertifikat einer Unterschriftenbehörde wie Verisign unterzeichnet wird. Das kann ziemlich teuer werden.


Sitzung 0 Isolation:

Es ist auch meine Überzeugung, dass Sie SendMessage nicht über Sitzungen hinweg anrufen können. Wenn Sie also einen Dienst in Sitzung 0 ausgeführt haben, müssen Sie ein anderes Mittel 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 später werden alle Dienste in Sitzung 0 und alle Anwendungen ausgeführt, die Sie in Sitzung> 0 ausgeführt haben. Dies wird als Sitzung 0 -Isolation bezeichnet. Hier ist ein gutes Dokument, das hat Informationen alles über Sitzung 0 Isolation.

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 fungiert, um die Nachricht in derselben Sitzung an die Anwendung weiterzuleiten .


Gesamt:

Wenn Sie Ihre Bewerbung auf Pre-Vista entwickeln und dies gut funktioniert. Da ist ein sehr hoch Chance, es wird in Vista gebrochen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top