delphi 多显示器-在鼠标光标所在的显示器中打开应用程序窗口

chhqkbe1  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(156)

我有一个 Delphi 7主窗体,带有一个“打开”按钮,它可以打开另一个窗体,就像这样:

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Application.CreateForm(TfrmPswd, frmPswd);
    Application.NormalizeTopMosts;
    Application.ProcessMessages;
    frmPswd.ShowModal;
  finally
    frmPswd.Release;
    frmPswd := nil;
  end;
end;

字符串
在frmPswd OnCreate事件中,我尝试将其集中化,具体取决于鼠标光标所在的监视器,如下所示:

procedure TfrmPswd.FormCreate(Sender: TObject);
var
  Monitor: TMonitor;
begin
  Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
  frmPswd.Top := Round((Monitor.Height - frmPswd.Height) / 2);
  frmPswd.Left := Round((Monitor.Width - frmPswd.Width) / 2);
end;


当主窗体与鼠标光标位于同一个监视器中时,frmPswd窗体将像预期的那样在该监视器的中心打开。但是当主窗体在不同于鼠标的显示器中时,frmPswd出现在一个奇怪的位置,我不明白为什么。

编辑:

以下是雷米Lebeau提出的结果,即使使用了新代码:

Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2);
Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2);

Monitor 0
Top: 0
Left: 0
Width: 1440
Height: 900

Monitor 1
Top: -180
Left: -1920
Width: 1920
Height: 1080

frmPswd.Width = 200
frmPswd.Height = 200

Main form in Monitor 0 and Mouse cursor in Monitor 0
frmPswd.Top = 350
frmPswd.Left = 620

Main form in Monitor 1 and Mouse cursor in Monitor 1
frmPswd.Top = 260
frmPswd.Left = -1060

Main form in Monitor 0 and Mouse cursor in Monitor 1
frmPswd.Top = 440
frmPswd.Left = 860

Main form in Monitor 1 and Mouse cursor in Monitor 0
frmPswd.Top = 170
frmPswd.Left = -1300

nqwrtyyt

nqwrtyyt1#

你不应该像这样使用Application.CreateForm()。使用TfrmPswd.Create()。使用Free()代替Release()
去掉Application.NormalizeTopMosts()Application.ProcessMessages()调用,它们根本不属于这段代码。
OnCreate事件中,使用Self代替全局变量frmPswd
您需要将Monitor.LeftMonitor.Top偏移量添加到新坐标中,以考虑不从Virtual Screen偏移量0,0处开始的监视器。
试试类似这样的东西:

procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TfrmPswd;
begin
  frm := TfrmPswd(nil);
  try
    frm.ShowModal;
  finally
    frm.Free;
  end;
end;

字符串

procedure TfrmPswd.FormCreate(Sender: TObject);
var
  Monitor: TMonitor;
begin
  Monitor := Screen.MonitorFromPoint(Mouse.CursorPos);
  Self.Left := Monitor.Left + ((Monitor.Width - Self.Width) div 2);
  Self.Top := Monitor.Top + ((Monitor.Height - Self.Height) div 2);
end;

23c0lvtd

23c0lvtd2#

这也可以在微软PowerToys的帮助下实现。如果你将有一个选项,使用活动焦点或鼠标指针下花式区域。

相关问题