核心概念架構
虛擬桌面
Windows 將所有顯示器映射為單一虛擬桌面,座標系統原點 (0,0) 位於主顯示器左上角。非主顯示器座標可為負值。
關鍵物件模型
- TScreen:全域單例 (
Screen),管理所有顯示器資訊
- TMonitor:單一顯示器資訊封裝 (唯讀屬性)
- TCustomForm:表單基類,內建多螢幕支援屬性/方法
TScreen 關鍵屬性與方法
| 屬性/方法 | 說明 |
MonitorCount | 顯示器數量 |
Monitors[Index] | 取得指定索引的 TMonitor 實例 |
DesktopLeft/Top/Width/Height | 虛擬桌面完整範圍 |
WorkAreaLeft/Top/Width/Height | 主顯示器工作區 (扣除工作列) |
Height/Width | 主顯示器解析度,非虛擬桌面! |
MonitorFromPoint(Point) | 取得包含指定點的顯示器 |
MonitorFromRect(Rect) | 取得與矩形交集最大的顯示器 |
MonitorFromWindow(Handle) | 取得視窗所在顯示器 |
TMonitor 關鍵屬性
| 屬性 | 說明 |
Handle | HMONITOR 控制代碼 |
MonitorNum | 顯示器編號 |
Primary | 是否為主顯示器 |
Left/Top/Width/Height | 相對虛擬桌面座標 |
BoundsRect | 完整範圍 TRect |
WorkareaRect | 工作區範圍 TRect |
表單多螢幕控制屬性
| 屬性 | 選項 | 行為 |
Position | poScreenCenter | 置中於主顯示器 |
poDesktopCenter | 置中於虛擬桌面 (跨螢幕風險) |
DefaultMonitor | dmDesktop | 不特別處理 |
dmPrimary | 顯示於 Screen.Monitors[0] (非必為主顯示器!) |
dmMainForm | 顯示於主表單所在顯示器 |
dmActiveForm | 顯示於目前作用中表單所在顯示器 |
實用技巧:跨螢幕移動與完整顯示
方法一:手動設定座標
// 移動表單到第二個顯示器左上角
if Screen.MonitorCount > 1 then begin
Form2.Left := Screen.Monitors[1].Left;
Form2.Top := Screen.Monitors[1].Top;
end;
方法二:MakeFullyVisible 確保完整可見
Form2.MakeFullyVisible; // 自動調整位置,避免跨螢幕或超出邊界
常見陷阱與避坑指南
- Screen.Width/Height ≠ 虛擬桌面大小:它們是主顯示器解析度。
- dmPrimary ≠ 主顯示器:它指向
Monitors[0],實際主顯示器由 Primary 屬性決定。
- poDesktopCenter 危險:視窗可能出現在兩螢幕交界處。
- 非主顯示器座標可為負:左側/上方螢幕的 Left/Top 為負值。
總結
Delphi VCL 對多顯示器支援相當完善。善用 Screen.Monitors 列舉與 TMonitor 幾何資訊,配合表單的 DefaultMonitor 與 MakeFullyVisible,能輕鬆開發出專業的多螢幕應用程式。