![]() |
Re: Mit Service auf Desktop zeichnen
Habe keinen Bock o.g. zu wiederholen. Fakt ist, daß ein Service mal erstens nie interaktiv sein sollte (Stichwort:
![]() Du kannst einem Service-Thread auch sagen, daß er sich an einen anderen Desktop hängen soll, der aber immernoch in der gleichen Window-Station sein muß ( ![]() ![]() Ich an deiner Stelle würde mir eine Ersatz-GINA basteln. Diese GINA kann jederzeit alles auf allen interaktiven Desktops (auch den SAS-Desktops) machen, wenn du es brauchst. Etwas Code (veraltet, weil Delphi) hier: http://assarbad.info/stuff/!export/ancient/agreementgina.rar Zwar erfordert das unter Vista eine Neuausrichtung (dort gibt es eine neue Methode welche die GINA ersetzt, soweit ich weiß), aber für alle vorigen NT-Systeme bist du voll kompatibel. |
Re: Mit Service auf Desktop zeichnen
Ich hab mich auch mal damit beschäftigt und komm jetzt an folgender Stelle nicht weiter:
Stand: - Mein Service läuft jetzt in der Station "WinSta0" (also nicht mit in der Station "Service-0x0-3e7$") - Somit kann ich auch den Hauptdesktop "Default" (und natürlich auch alle anderen Desktops in "WinSta0") öffnen - Ich kann auch einen Process auf dem Desktop starten (ich geh zumindest davon aus das der Prozess auf dem Desktop gestartet wurde da ich in der eintsprechenden WinStation bin und bei CreateProcess den Desktop "Default" angegeben hab. Der Prozess tauch auch im Taskmananger auf, allerdings seh ich das Programm optisch nicht. Muss ich da noch irgendwas beachten damit das Programm sichtbar ist auf dem Desktop? PS.: Auf den Desktop zeischnen und Formulare anzeigen (auch auf Winlogon) kann ich übrigens. Es scheitert wirklich nur noch am starten eines Prozesses auf dem Desktop. |
Re: Mit Service auf Desktop zeichnen
Das kann man ohne Code natürlich kaum sagen, denn deine Frage ist schon sehr spezifisch.
Ich nehme an, daß entweder die ACLs des Desktops in deinem Fall noch nicht stimmen, du bei CreateProcess was falsch machst, oder der Thread zuvor ein Impersonate machen muß um was auf dem Desktop zu starten. Wie gesagt, nix genaues weiß man nich - zumindest ohne deinen exakten Code. |
Re: Mit Service auf Desktop zeichnen
So wechsle ich den Desktop (so das Zeischnen über GetDC(0) funktioniert und erzeugte TForms auch auf diesem Desktop landen)
Delphi-Quellcode:
var
lDesktop, lStationNew : Cardinal; begin lStationNew := OpenWindowStation('WinSta0', True, GENERIC_ALL); if (lStationNew <> 0) then begin SetProcessWindowStation(lStationNew); lDesktop := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, True, GENERIC_ALL); if (lDesktop <> 0) then begin if SetThreadDesktop(lDesktop) then fCouldSwitch := True; CloseDesktop(lDesktop); end; CloseWindowStation(lStationNew); end; |
Re: Mit Service auf Desktop zeichnen
Hast du mal versucht die Zeile "fCouldSwitch := True;" durch dein CreateProcess (Desktop und WinSta nicht explizit angeben!) zu ersetzen?
|
Re: Mit Service auf Desktop zeichnen
Ok, damit gehts. Mit dem unschönen Nebeneffekt das sich zum Beispiel Notepad nicht zeichnet. So als würden keine Messages ankommen. Und aus irgend einem Grund kann ich in meiner Anwendung zwar klicken aber nix schreiben. (wenn ich mein Form bzw. Notepad auf dem Desktop "winlogon" ausführe)
|
Re: Mit Service auf Desktop zeichnen
Zitat:
|
Re: Mit Service auf Desktop zeichnen
Ob ich die Handles Sofort wieder schließe oder nicht ändert nichts am verhalten (grad probiert). Die Handles hab ich bisher nicht vererbt, "bInheritHandles" war also False. Wenn ich es auf "True" setze hab ich den Effekt das ich die Anwendung gar nicht zu gesicht bekomme (die bleibt dann unsichtbar)
|
Re: Mit Service auf Desktop zeichnen
Zitat:
|
Re: Mit Service auf Desktop zeichnen
@SirThornberry: Hi kannst du mir verraten wie du es geschaft hast das das Formular angezeigt wird? Denn ich hab des so probiert, aber es wird trozdem nicht angezeigt:
Delphi-Quellcode:
var
lDesktop, lStationNew : Cardinal; begin lStationNew := OpenWindowStation('WinSta0', True, GENERIC_ALL); if (lStationNew <> 0) then begin SetProcessWindowStation(lStationNew); lDesktop := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, True, GENERIC_ALL); if (lDesktop <> 0) then begin if SetThreadDesktop(lDesktop) then begin Form1 := TForm1.Create(Service1); Form1.Show; end; CloseDesktop(lDesktop); end; CloseWindowStation(lStationNew); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz