![]() |
FindWindow als System
Hi ihrs!
Ist es irgendwie möglich FindWindow ein einem Programm das unter dem Systemkonto läuft so zu benutzen, dass es Fenster vom aktuell angemeldeten Benutzer findet??? Vielen Dank für eure Antworten schon mal |
Re: FindWindow als System
Dienste und Programme die unter dem Systemkonto laufen, laufe auf einen anderen Desktop, so viel ich weiß.
|
Re: FindWindow als System
Ja! Das hab ich ja auch gerafft. Aber deshalb ja auch die Frage hier! Sonst wüsste ich ja wie es funktionert!
|
Re: FindWindow als System
Zitat:
(viele haben unter Windows XP die schnelle Benutzerabschlachtung, ähm -umschaltung (Fast User Switching) aktiviert - und damit sind auch ohne Tools mehrere interaktive Desktops unter verschiedenen Benutzerkonten möglich...) Gruss Nico ps: was Du suchst ist SetProcessWorkstation/SetThreadDesktop und eine Zeitmaschine (weil aufwändig) |
Re: FindWindow als System
OK! Ich hab jetzt schon seit gestern mit SetThreadDesktop rumprobiert.
Delphi-Quellcode:
Ich hol mit OpenDesktop das Handle zu einem Desktop und ordne dann mit SetThreadDesktop diesen Desktop dem Programm zu. Das Programm macht dann keinen Fehler, aber das Fenster erscheint dann nur auf dem Logon Bildschirm und nicht wie gewünscht bei einem angemeldeten Benutzer.
procedure TForm1.Button1Click(Sender: TObject);
var hDesktop: THandle; begin SetLastError(0); hDesktop:=OpenDesktop('default', DF_ALLOWOTHERACCOUNTHOOK, False, GENERIC_ALL); if hDesktop <> 0 then begin if SetThreadDesktop(hDesktop) then begin Messagebox(0,'Hallo','Na',64); CloseDesktop (hDesktop); end; end; if GetLastError<>0 then Messagebox(0,pchar(inttostr(GetLastError)),'',64); end; Das ich bei OpenDesktop "default" einsetzen kann hab ich durch diesen Code herrausgefunden:
Delphi-Quellcode:
Aber was mich auch noch wundert: Wenn ich mich mit 2 Benutzern anstelle von nur einem gleichzeitig anmelde, müsste dann nicht noch ein Desktop mehr erscheinen??? Passiert bei mir zumindestens nicht. Ich hab immer nur
function EnumDesktopProc(lpszDesktop:LPTSTR;lParam:LPARAM):Boolean; stdcall;
begin Form1.Treeview1.Items.AddChild(Form1.Treeview1.Items.Item[lParam],lpszDesktop).AbsoluteIndex; result:=true; end; function EnumWindowStationProc(lpszWindowStation:LPTSTR; lParam:LPARAM): Boolean; stdcall; begin EnumDesktops(OpenWindowStation(lpszWindowStation,false,GENERIC_READ),@EnumDesktopProc,Form1.Treeview1.Items.AddChild(Form1.Treeview1.Items.Item[lParam],lpszWindowStation).AbsoluteIndex); result:=true; end; procedure TForm1.Button2Click(Sender: TObject); begin Treeview1.Items.Clear; EnumWindowStations(@EnumWindowStationProc,Treeview1.Items.AddChildFirst(nil,'pc').AbsoluteIndex); end; "Default", "Disconnect" und "Winlogon". Weiß jemand eine Lösung, wie ich mit SetThreadDesktop es schaffe ein Programm, dass unter dem Benutzer System läuft, an einen anderen Desktop (z.B.: den des Benutzers, der grade am PC arbeitet) zu binden??? |
Re: FindWindow als System
OK! Ich habs geschafft! Vielen Dank für deinen Tipp NicoDE!
Delphi-Quellcode:
var
hwinstaUser,hdeskUser: THandle; begin SetLastError(0); hwinstaUser:=OpenWindowStation('winsta0', FALSE, MAXIMUM_ALLOWED); if hwinstaUser <> 0 then if SetProcessWindowStation(hwinstaUser) then begin hdeskUser:=OpenDesktop('Default', 0, FALSE, MAXIMUM_ALLOWED); if hdeskUser <> 0 then if SetThreadDesktop(hdeskUser) then Messagebox(0,'Es geht!!!','NA!!!',64); end; if GetLastError<>0 then Messagebox(0,pchar(inttostr(GetLastError)),'Fehler',64); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 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