首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

C# WinForms 視窗最大化不遮擋工作列的正確做法

     編輯:Java 相關知識

問題背景

直接設定 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; // 一次設定位置與大小
}

常見誤區

  1. 直接用 Maximized:會覆蓋任務列,且無法自訂邊距。
  2. 硬編碼解析度:不支援 DPI 縮放、多螢幕、任務列位置變動。
  3. 忽略 DPI:高 DPI 環境下需設定 SetProcessDpiAwareness 或在 Manifest 標註 dpiAware。

總結

使用 Screen.WorkingArea 是 WinForms 視窗最大化不遮擋任務列的標準、穩健做法,支援多螢幕、DPI 縮放與任務列自動隱藏等場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved