直接設定 Form.WindowState = FormWindowState.Maximized 會導致視窗覆蓋任務列。正確做法是依據螢幕工作區(排除任務列)設定視窗位置與大小。
///
/// 將視窗最大化至工作區,不遮擋任務列
///
/// 目標視窗
public virtual void MaximizeToWorkingArea(Form frm) {
if (frm == null) return;
// 僅在非最大化狀態下調整,避免閃爍
if (frm.WindowState != FormWindowState.Maximized) {
frm.WindowState = FormWindowState.Normal;
}
Rectangle wa = Screen.PrimaryScreen.WorkingArea; // 排除任務列的可用區域
frm.Location = new Point(wa.Left, wa.Top);
frm.Size = new Size(wa.Width, wa.Height);
// 可選:若仍想顯示最大化圖示
// frm.WindowState = FormWindowState.Maximized;
}
| 屬性 | 含義 |
|---|---|
Screen.PrimaryScreen.Bounds | 主螢幕完整解析度(含任務列) |
Screen.PrimaryScreen.WorkingArea | 扣除任務列、工具列後的可用區域 |
public void MaximizeOnCurrentScreen(Form frm) {
if (frm == null) return;
Screen scr = Screen.FromControl(frm); // 取得視窗所在螢幕
Rectangle wa = scr.WorkingArea;
frm.WindowState = FormWindowState.Normal;
frm.Bounds = wa; // 一次設定位置與大小
}
SetProcessDpiAwareness 或在 Manifest 標註 dpiAware。使用 Screen.WorkingArea 是 WinForms 視窗最大化不遮擋任務列的標準、穩健做法,支援多螢幕、DPI 縮放與任務列自動隱藏等場景。