有没有办法在 Delphi 或 C++Builder 中指定应用程序出现在哪个监视器上?
我正在为客户开发一个简单的程序,该程序在由酒店系统生成的辅助监视器上显示厨房订单。 目前,他们需要在第二台显示器启动后手动将窗口拖到第二台显示器上。
全局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;
您可以使用该位置的任何正偏移将其放置在该监视器中的任何位置。 您也可以从那里获取宽度和高度以了解尺寸。
在程序关闭前保存窗口位置并在启动时恢复它们。多显示器显示只会增加桌面的大小;其他显示器表面只是具有同一 X/Y 平面的不同部分,其原点位于主显示器的左上角。
顺便说一句,Forms 单元中的 Screen 变量有一个名为 MonitorCount 的属性和另一个可索引属性 Monitors[Index: Integer]: TMonitor。 TMonitor 有表示左、上、宽、高等属性,因此您需要的所有信息都在那里。
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;
这并不是您的问题所暗示的答案,但是您不能在应用程序关闭时存储窗口设置(大小、位置、最大化状态),然后在启动时应用它们吗?
我不久前在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;
Windows 将允许您在 CreateWindow API 调用中指定窗口的坐标。 我对 Delphi 或 C++Builder 的了解不够,不知道您是否有权访问该过程的该部分。
您还可以在 WM_CREATE 处理程序中移动窗口。
EnumDisplayMonitors 将为您提供系统中每个显示器的坐标。
我对 Windows 系统不太了解,所以我建议像这样的 hack。
抓住可视桌面的宽度(两个显示器组合),将其除以一半,并将其作为起始位置。
您还可以查看API告诉您monitor2尺寸的内容。