Also theoretisch müsste doch, wenn ich auf den zweiten Desktop switche und dann mit Shellexecute ein Programm starte, dieses Programm auf ddiesem zweiten Desktop zu sehen sein, oder?
Auf jedenfall geschieht das nicht. Das programm wird auf dem ersten Desktop angezeigt...
Edit: Also ich hab jetzt mal den "Ernstfall" getestet:
Ein Dienst(TService) welcher den Desktop switcht und mit Canvas darauf die Uhrzeit anzeigt.
Funktioniert
NICHT. Er switcht zwar den Desktop und wartet die 20 Sekunden, aber das Canvas wird nicht gezeichnet, hier der Code:
Delphi-Quellcode:
procedure TTestServerDienst.BaitAndSwitchDesktop;
var
OldDesk : HDESK;
NewDesk : HDESK;
Canvas : TCanvas;
DC : HDC;
begin
OldDesk := GetThreadDesktop(GetCurrentThreadID);
NewDesk := CreateDesktop(PChar('
Foobar'),
nil,
nil, 0, DESKTOP_CREATEWINDOW
or
DESKTOP_SWITCHDESKTOP
or DESKTOP_CREATEMENU,
nil);
if NewDesk <> 0
then
begin
SetThreadDesktop(NewDesk);
Windows.SwitchDesktop(NewDesk);
//DrawPicture('E:\Bild_2.bmp');
ATestTime:=IncSecond(Now,20);
try
Canvas := TCanvas.Create();
try
try
Canvas.Handle :=
DC;
with canvas.Font
do
begin
Size:=96;
Color:=clRed;
end;
while (ATestTime > Now)
and not Terminated
do
Canvas.TextOut(100,800,DateTimetoStr(ATestTime));
except
end;
finally
Canvas.Free;
end;
finally
ReleaseDC(0,
DC);
end;
Windows.SwitchDesktop(OldDesk);
SetThreadDesktop(OldDesk);
CloseDesktop(NewDesk);
end;
CloseDesktop(OldDesk);
end;
{******************************************************************************}
procedure TTestServerDienst.ServiceExecute(Sender: TService);
begin
ATestTime:=IncMinute(Now,2);
while (ATestTime>Now)
and not terminated
do
BaitAndSwitchDesktop;
end;
Was muss ich ändern?