我在双显示器系统上使用 Windows 10(在 Parallels 中虚拟化)中的 Delphi 10.4.2。要在多显示器系统上重现问题,请创建一个新的 Windows VCL 应用程序并在窗体上放置两个按钮:btnPrimaryMonitor
和btnSecondaryMonitor
. 然后通过为两个按钮创建单击处理程序来插入此代码:
procedure TForm1.btnPrimaryMonitorClick(Sender: TObject);
begin
RepositionFormToMonitor(0);
EnableDisableButtons;
end;
procedure TForm1.RepositionFormToMonitor(const aMonitor: Integer);
const
offset = 2;
begin
Self.Width := Screen.Monitors[aMonitor].Width - offset;
Self.Height := Screen.Monitors[aMonitor].Height - offset;
Self.Top := Screen.Monitors[aMonitor].Top;
Self.Left := Screen.Monitors[aMonitor].Left;
end;
procedure TForm1.btnSecondaryMonitorClick(Sender: TObject);
begin
RepositionFormToMonitor(1);
EnableDisableButtons;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
EnableDisableButtons;
Self.BorderStyle := bsNone;
Self.FormStyle := fsStayOnTop;
RepositionFormToMonitor(0);
end;
procedure TForm1.EnableDisableButtons;
begin
btnPrimaryMonitor.Enabled := (Self.Monitor.MonitorNum = 1);
btnSecondMonitor.Enabled := (Self.Monitor.MonitorNum = 0);
end;
这很有效,但是一旦我设置offset = 1
或offset = 0
屏幕变黑!
代码的目的是通过单击按钮将最大化的停留在顶部的表单从主监视器重新定位到辅助监视器,然后通过单击btnSecondMonitor
按钮返回到主监视器btnPrimaryMonitor
。
如何避免这个问题?