2008-10-15 34 views
17

有没有办法指定应用程序在Delphi或C++ Builder中出现的监视器?在第二台显示器上启动程序?

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

回答

22

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

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

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

-4

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

抓住可视桌面的宽度(两个显示器相结合),将其分成一半并作为您的起始位置。

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

+1

如果两台显示器具有相同的尺寸桌面这只会工作。 – Re0sless 2008-10-15 21:50:31

+0

@ReOsless:雅。就像我说的那样,它是一种黑客。 – 2008-10-16 14:19:59

-3

Windows将允许您在CreateWindow API调用中指定窗口的坐标。我对Delphi或C++ Builder知之甚少,不知道你是否有权访问这部分流程。

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

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


很明显,德尔福和C++ Builder的设施使得这个答案有点不相关。如果有人遇到这个问题,我会把它留在这里,但需要为不同的环境作出回答。

+2

德尔福具有抽象涵盖所有这些功能,从Screen.Monitors集合到控制表单位置的预建事件。 – 2008-10-15 21:13:15

1

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

+0

这是最简单的实现 – benPearce 2008-10-15 20:58:08

+2

这有一个问题。如果在应用程序使用第二个montor之后从计算机中删除,会发生什么情况? (MySql查询浏览器有这个问题) – 2008-10-17 16:02:06

25

全局屏幕对象(表单的一部分)具有监视器的概念。我认为这是大约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; 

你可以使用任何正从该位置偏移把它放在任何地方监控。您可以从那里获得宽度和高度,以了解尺寸。

-2

我曾在德尔福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; 
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; 
相关问题