OK! Ich hab jetzt schon seit gestern mit SetThreadDesktop rumprobiert.
Delphi-Quellcode:
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;
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.
Das ich bei OpenDesktop "default" einsetzen kann hab ich durch diesen Code herrausgefunden:
Delphi-Quellcode:
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;
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
"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???