多监视器 - 在鼠标光标所在的监视器中打开应用程序窗口

时间:2016-03-18 23:42:34

标签: delphi position center monitor

我有一个Delphi 7主表单,其中包含" open"按钮,打开另一个表单,就像这样:

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出现在一个奇怪的位置,我无法理解为什么。

修改

以下是Remy 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

1 个答案:

答案 0 :(得分:3)

您不应该像这样使用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;