3 Stimmen

Ausschalten der Anzeige über den Windows-Dienst

Ich habe einen Windows-Dienst geschrieben, der den Bildschirm ausschalten soll, wenn bestimmte Bedingungen eintreten. Der von mir verwendete Code lautet :

private const int MONITOR_OFF = 2;
SendMessage(GetDesktopWindow().ToInt32(), 
   WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);

Derselbe Code funktioniert in einer Windows-Anwendung, aber wenn er im Windows-Dienst ausgeführt wird, passiert nichts. Es gibt auch keine Ausnahme und Marshal.GetLastWin32Error() gibt ebenfalls 0 zurück.

Haben Sie eine Idee, was ich übersehen haben könnte?

5voto

Ken White Punkte 120217

Da ein Dienst keinen Standardzugriff auf den Desktop hat, gibt Ihr Aufruf von GetDesktopWindow() etwas anderes zurück, als Sie erwarten; Sie konvertieren das dann blindlings in einen Int32 und verwenden diesen als Fensterhandle-Ziel von SendMessage(). Da der Empfänger wahrscheinlich kein gültiges Fenster ist, tut es nichts.

2voto

Josh Pearce Punkte 3307

Sie können versuchen, die Eigenschaften des Dienstes im Dienstverwaltungsprogramm zu bearbeiten, um eine Desktop-Interaktion zu ermöglichen.

0voto

Matthew Whited Punkte 21770

Dienste werden in einem eigenen virtuellen Desktopbereich ausgeführt (sie können sogar einen eigenen Benutzerprofilbereich haben). Dies ist Teil des in Windows integrierten Sicherheitsmodells. Am besten wäre ein Dienst, der im Hintergrund läuft, und ein Client im Benutzermodus, der auf dem Desktop des Benutzers läuft. Je nach Zugriffsberechtigung des Benutzers könnte der Benutzer den Dienst/Benutzermodus-Client beenden. Sie könnten aber auch die Prozesse abfragen, um sicherzustellen, dass die Benutzeranwendung noch läuft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X