Hallo liebe Delphi-PRAXIS.
Euer Forum ist echt eine goldene Fundgrube nur jetzt steh ich an.
Mein Problem: Ich benötige einen Windows Dienst der mir Programme startet und überwacht ob die auch brav laufen.
Soweit so gut. Unter XP ist das ja alles kein Problem. Nur sobald VISTA oder Win7 ins Spiel kommen gibt's Probleme.
Dort dürfen Dienste und Programme die von diesem gestartet wurden nicht mehr mit dem Desktop des Benutzers kommunizierten. Also meine Idee war die Programme einfach unter dem angemeldeten Benutzer laufen zu lassen. Gesagt getan mit
CreateProcessAsUser kein Problem.
Nur wenn der Dienst jetzt das geöffnete Programm wieder schließen möchte hapert's.
Da das zu öffnende Programm immer diverse Dateien geöffnet hat und auch in diesen fleißig schreibt kann ich kein
TerminateProcess verwenden. Damit würgt man das Programm einfach ab und die Dateien bleiben offen bzw. die Daten im Speicher die noch nicht geschrieben wurden gehen verloren.
Aber da gibt's ja noch das
SendMessage(WinHandle, WM_CLOSE,...). Dazu wird allerdings das
Handle auf das Fenster benötigt. Dieses lässt sich mit
EnumWindows auch einfach herausfinden.
Allerdings bekomme ich da nur Fenster des eigenen Desktops. Also wenn das der Dienst ausführt eben nur Fenster die von "NT-AUTORITÄT\SYSTEM" geöffnet wurden.
Aber zum Glück gibt's da noch das
EnumDesktopWindows nur woher ein gültiges
Handle auf einen Desktop nehmen. Mit
EnumWindowStations und dem nachfolgenden
EnumDesktops lässt sich so eines ermitteln nur bekomme ich dabei eben auch alles andere nur nicht den Desktop des Benutzers.
Mit
Delphi-Quellcode:
StationHandle := OpenWindowStation('WinSta0', False, MAXIMUM_ALLOWED);
if SetProcessWindowStation(StationHandle) then
DesktopHandle := OpenDesktop('Default', 0, False, MAXIMUM_ALLOWED);
konnte ich dann endlich auf den richtigen Desktop zugreifen das allerdings wieder nur unter XP.
Bei VISTA oder Win7 bekomme ich immer nur den Desktop von "NT-AUTORITÄT\SYSTEM".
Jetzt meine Frage: Gibt's da irgendwas das ich übersehen habe oder funktioniert das einfach unter VISTA überhaupt nicht mehr?
Aja anbei mein Demo Programm zum Testen (Allerdings fürs Delphi 2009).
Ich hoffe ich habe alle benötigten Dateien mit dazu kopiert.
Verwendet werden VirtualTrees,
JWSCL und eine eigene Soket Komponente.
Danke im Voraus Jakson