Ich schreibe gerade einen Bildschirmschoner in Delphi. Ich möchte einen TpresentationFrm auf jedem Monitor im Vollbildmodus anzeigen. Zu diesem Zweck habe ich das folgende (unvollständige) Programm geschrieben:
program ScrTemplate;
uses
...
{$R *.res}
type
TScreenSaverMode = (ssmConfig, ssmDisplay, ssmPreview, ssmPassword);
function GetScreenSaverMode: TScreenSaverMode;
begin
// Some non-interesting code
end;
var
i: integer;
presentationForms: array of TpresentationFrm;
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
case GetScreenSaverMode of
ssmConfig:
Application.CreateForm(TconfigFrm, configFrm);
ssmDisplay:
begin
SetLength(presentationForms, Screen.MonitorCount);
for i := 0 to high(presentationForms) do
begin
Application.CreateForm(TpresentationFrm, presentationForms[i]);
presentationForms[i].BoundsRect := Screen.Monitors[i].BoundsRect;
presentationForms[i].Visible := true;
end;
end
else
ShowMessage(GetEnumName(TypeInfo(TScreenSaverMode), integer(GetScreenSaverMode)));
end;
Application.Run;
end.
Wenn die ssmDisplay
Code ausgeführt wird, werden tatsächlich zwei Formulare erstellt (ja, ich habe genau zwei Monitore). Aber sie erscheinen beide auf dem ersten Monitor (Index 0, aber nicht der primäre).
Wenn ich durch den Code gehe, sehe ich, dass die Screen.Monitors[i].BoundsRect
sind korrekt, aber aus irgendeinem Grund erhalten die Formulare falsche Grenzen:
Watch Name Value (TRect: Left, Top, Right, Bottom, ...)
Screen.Monitors[0].BoundsRect (-1680, 0, 0, 1050, (-1680, 0), (0, 1050))
Screen.Monitors[1].BoundsRect (0, 0, 1920, 1080, (0, 0), (1920, 1080))
presentationForms[0].BoundsRect (-1680, 0, 0, 1050, (-1680, 0), (0, 1050))
presentationForms[1].BoundsRect (-1920, -30, 0, 1050, (-1920, -30), (0, 1050))
Bei der ersten Form wird die gewünschte Position erreicht, bei der zweiten jedoch nicht. Anstatt von x=0 bis 1920 zu gehen, nimmt es x=-1920 bis 0 ein, d.h. es erscheint auf dem ersten Bildschirm, über dem ersten Formular. Was ist hier falsch? Wie gehe ich richtig vor, um das zu erreichen, was ich will?