在第二台显示器上启动程序?

时间:2008-10-15 20:47:14

标签: delphi c++builder multiple-monitors point-of-sale

有没有办法在Delphi或C ++ Builder中指定应用程序出现在哪个监视器上?

我正在为客户开发一个简单的程序,该程序在二级监视器上显示厨房订单,由酒店系统生成。目前,他们需要在启动后手动将窗口拖动到第二台显示器上。

7 个答案:

答案 0 :(得分:27)

全局Screen对象(Forms的一部分)具有监视器的概念。我认为这是在Delphi 6或7中添加的。以下代码将起作用:

// Put the form in the upper left corner of the 2nd monitor
//   if more then one monitor is present.
if Screen.MonitorCount > 1 then
begin
  Left := Screen.Monitors[1].Left;
  Top := Screen.Monitors[1].Top;
end;

您可以使用该位置的任何正偏移量将其放置在该监视器中的任何位置。您也可以从那里获得宽度和高度以了解尺寸。

答案 1 :(得分:23)

在程序关闭之前保存窗口位置并在启动时恢复它们。多监视器显示只会增加桌面的大小;其他监视器表面只有相同X / Y平面的不同部分,其原点位于主监视器的左上角。

这可以通过any of several components自动为您完成。

顺便说一句,Forms单元中的Screen变量有一个名为MonitorCount的属性和另一个可索引属性,Monitors [Index:Integer]:TMonitor。 TMonitor具有指示左,顶部,宽度,高度等的属性,因此您需要的所有信息都在那里。

答案 2 :(得分:1)

不是你的问题所暗示的答案,但是当应用程序关闭时,你不能存储窗口设置(大小,位置,最大化状态),然后在启动时应用它们吗?

答案 3 :(得分:1)

procedure TMDIChild.btnShowMonClick(Sender: TObject);
begin
    if Screen.MonitorCount > 1 then
    begin
      FormShow.Left:=Screen.Monitors[1].Left;
      FormShow.Top:=Screen.Monitors[1].Top;
      FormShow.Width:=Screen.Monitors[1].Width;
      FormShow.Height:=Screen.Monitors[1].Height;
    end
    else
    begin
        FormShow.Show;
    end;
end;

答案 4 :(得分:-2)

我刚刚在Delphi 5中做过类似的事情:

procedure TForm18.FormCreate(Sender: TObject);
var
  Mon: TMonitor;
  MonitorIdx: Integer;
begin
  MonitorIdx := 1; // better read from configuration
  if (MonitorIdx <> Monitor.MonitorNum) and (MonitorIdx < Screen.MonitorCount) then begin
    Mon := Screen.Monitors[MonitorIdx];
    Left := Left + Mon.Left - Monitor.Left;
    Top := Top + Mon.Top - Monitor.Top;
  end;
end;

答案 5 :(得分:-3)

Windows允许您在CreateWindow API调用中指定窗口的坐标。我不太了解Delphi或C ++ Builder,知道你是否可以访问该过程的那一部分。

您也可以在WM_CREATE处理程序中移动窗口。

EnumDisplayMonitors将为您提供系统中每个监视器的坐标。

<小时/> 很显然,Delphi和C ++ Builder的设施使得这个答案有点无关紧要。我会把它留在这里,万一有人遇到这个问题,但需要回答不同的环境。

答案 6 :(得分:-4)

我对Windows系统做的不多,所以我建议像这样的黑客。

抓住可视桌面的宽度(两个显示器合并),将其除以一半,然后将其作为起始位置。

你也可以看看api告诉你monitor2的尺寸。