Des Rätsels Lösung findet sich
hier.
Das dortige Projekt auf das wesentliche, das hier das Problem zu lösen demonstrieren soll, reduziert, sieht die Projektdatei so aus:
Delphi-Quellcode:
program Bildschirmschoner;
uses
Forms,
SysUtils,
Windows,
Graphics,
Classes,
scrn in 'scrn.pas' {screen};
{$E SCR}
{$R *.RES}
var DemoWnd:hwnd;
MyRect:TRect;
ScrWidth,ScrHeight:Integer;
MyCanvas:TCanvas;
begin
Application.Initialize;
if Copy(UpperCase(ParamStr(1)),1,2)='/P' then
begin
DemoWnd := StrToInt(UpperCase(ParamStr(2)));
while not IsWindowVisible(DemoWnd) do Application.ProcessMessages;
GetWindowRect(DemoWnd,MyRect);
ScrWidth:=succ(MyRect.Right-MyRect.Left);
ScrHeight:=succ(MyRect.Bottom-MyRect.Top);
MyRect:=Rect(0,0,ScrWidth-1,ScrHeight-1);
MyCanvas := TCanvas.Create;
MyCanvas.Handle := GetDC(DemoWnd);
while IsWindowVisible(DemoWnd) do
begin
MyCanvas.Pixels[random(ScrWidth),random(ScrHeight)]:=random(10000000);
//Application.ProcessMessages
end;
MyCanvas.Free;
Halt
end;
Application.CreateForm(Tscreen, screen);
Application.Run;
end.
In der Hauptschleife werden zur Demonstration einfach farbige Pixel im Vorschaufenster ausgegeben (Farbrauschen). Das süffisante an dieser Lösung ist, daß diese Schleife sogar ohne Application.ProcessMessages auskommt und dennoch sofort beendet wird, wenn die Vorschau eines anderen Bildschirmschoners gewählt wird.
Für alle, die es interessiert...