C# WinForms 实现全屏隐藏任务栏及状态还原详解

桃夭
桃夭
发布时间:2026-10-13 | 4人浏览过
原创

在开发 C# WinForms 应用程序(如银行取号机或信息展示屏)时,常需实现无干扰的全屏显示效果。本文介绍如何结合基础设置与 Windows API 调用,实现彻底隐藏任务栏的全屏模式,并确保退出全屏时能完美恢复窗体的原始位置和尺寸。

核心目标与效果

标准的窗口最大化往往无法覆盖处于前端的任务栏。本方案旨在达到以下效果:

  • 彻底全屏:无论用户是否在 Windows 设置中将任务栏固定在顶部,任务栏均被隐藏或退居后台,不遮挡应用界面。
  • 状态还原:退出全屏后,窗体自动恢复到全屏前的具体坐标(Location)、尺寸(Size)和窗口状态(WindowState)。

准备工作

开发环境需具备 C# WinForms 项目结构。核心逻辑依赖于 user32.dll 中的三个关键函数:FindWindow(获取任务栏句柄)、ShowWindow(控制任务栏显示/隐藏)以及 SystemParametersInfo(修改屏幕工作区域)。此外,需要定义相关的常量参数以配合 API 调用。

操作步骤与实现代码

第1步:定义外部 API 调用与常量

首先在类中引入必要的命名空间,并声明用于控制 UI 状态的 Windows API 函数。这是实现高级窗口管理的基础。

[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern Int32 ShowWindow(Int32 hwnd, Int32 nCmdShow);

[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern Int32 FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
private static extern Int32 SystemParametersInfo(Int32 uAction, Int32 uParam, ref Rectangle lpvParam, Int32 fuWinIni);

同时定义操作所需的常量值:

  • SPI_GETWORKAREA = 48:获取当前工作区矩形。
  • SPI_SETWORKAREA = 47:设置新的工作区矩形。
  • SW_SHOW = 5:显示窗口。
  • SW_HIDE = 0:隐藏窗口。
  • SPIF_UPDATEINIFILE = 0x1:更新用户配置文件。

第2步:实现全屏切换的主控逻辑

在全屏按钮的 Click 事件中,通过布尔标志位 m_IsFullScreen 判断当前状态。执行顺序至关重要:必须先调整系统工作区,再调整窗体属性,以确保层级关系正确。

private void btnFullScreen_Click(object sender, EventArgs e)
{
    m_IsFullScreen = !m_IsFullScreen;
    this.SuspendLayout();
    
    if (m_IsFullScreen) // 进入全屏
    {
        SetFormFullScreen(true);
        this.FormBorderStyle = FormBorderStyle.None;
        this.WindowState = FormWindowState.Maximized;
        this.Activate();
    }
    else // 恢复窗口
    {
        this.WindowState = FormWindowState.Normal;
        this.FormBorderStyle = FormBorderStyle.Sizable;
        SetFormFullScreen(false);
        this.Activate();
    }
    this.ResumeLayout(false);
}

注意使用 SuspendLayout 和 ResumeLayout 减少界面重绘闪烁,提升用户体验。

第3步:编写核心的工作区修改方法

SetFormFullScreen 方法负责实际隐藏或显示任务栏,并通过调整工作区让窗体铺满整个屏幕。关键在于利用 rectOld 记录原始工作区,以便后续还原。

public Boolean SetFormFullScreen(Boolean fullscreen)
{
    Rectangle rectOld = Rectangle.Empty;
    Int32 hwnd = FindWindow("Shell_TrayWnd", null); // 获取任务栏句柄
    
    if (hwnd == 0) return false;

    if (fullscreen) // 全屏模式
    {
        ShowWindow(hwnd, SW_HIDE); // 隐藏任务栏
        
        // 保存当前工作区
        SystemParametersInfo(SPI_GETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);
        
        // 将工作区设置为整个屏幕边界,排除任务栏占用
        Rectangle rectFull = Screen.PrimaryScreen.Bounds;
        SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectFull, SPIF_UPDATEINIFILE);
    }
    else // 恢复模式
    {
        ShowWindow(hwnd, SW_SHOW); // 显示任务栏
        
        // 恢复原来的工作区,这样窗体就能回到之前的位置和大小
        SystemParametersInfo(SPI_SETWORKAREA, 0, ref rectOld, SPIF_UPDATEINIFILE);
    }
    return true;
}

第4步:添加键盘快捷键支持

为了提升操作便捷性,可在表单级别重载按键事件,支持 F11 切换全屏,ESC 退出全屏。

protected override void OnKeyDown(KeyEventArgs e)
{
    base.OnKeyDown(e);
    if (e.KeyCode == Keys.F11)
    {
        btnFullScreen.PerformClick();
        e.Handled = true;
    }
    else if (e.KeyCode == Keys.Escape && m_IsFullScreen)
    {
        // ESC 退出全屏逻辑与点击恢复按钮一致
        m_IsFullScreen = false;
        this.WindowState = FormWindowState.Normal;
        this.FormBorderStyle = FormBorderStyle.Sizable;
        SetFormFullScreen(false);
        e.Handled = true;
    }
}

完成判断与注意事项

运行程序后,点击全屏按钮应看到任务栏消失,应用界面占据整个显示器分辨率。再次点击或按下 ESC 键,任务栏重新出现,且主窗体应停留在原先的位置和大小。需注意,此方法依赖 Windows Shell 机制,在标准桌面环境下稳定有效。若涉及多显示器环境,可能需要额外处理 Screen.AllScreens 逻辑以适配副屏全屏需求。

以上就是 C# WinForms 全屏显示功能的详细内容,更多关于 C# GUI 开发实用技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表