2008-10-15 33 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; 
相關問題