导读:本期聚焦于过客创作的《C#怎么实现全屏显示?C#如何取消窗体标题栏并最大化【代码】》,敬请观看详情。做C#桌面程序时,想让窗口铺满整个屏幕却总被标题栏和边框挡住?本文围绕WinForm窗体的全屏实现展开,先讲清楚FormBorderStyle属性设为None去掉标题栏的原理,再配合WindowState设置为Maximized让窗体真正铺满屏幕。文中还覆盖了全屏后任务栏遮挡的处理办法、快捷键Esc退出全屏的实现、无边框窗体拖动移动的代码方案,以及多显示器场景下全屏到指定屏幕的做法。每一段都给出可直接复制的完整代码,并对代码逐行解释,适合正在做播放器、大屏展示、工控上位机等需要全屏界面的开发者参考,帮你少踩坑、快速实现稳定的全屏效果。

C# WinForm开发中,全屏显示是一个很常见的需求,比如视频播放器、大屏数据展示系统、工控上位机界面等,几乎都要求窗口铺满整个显示器,同时隐藏标题栏、最小化按钮这些系统元素。很多初学者一上来就把WindowState设成Maximized,结果发现标题栏还在,窗口也没有真正盖住任务栏。这篇文章就把WinForm全屏的完整实现方案讲透,包括去标题栏、盖住任务栏、退出全屏、无边框拖动以及多显示器全屏,每一步都附上可直接运行的代码。

C#怎么实现全屏显示?C#如何取消窗体标题栏并最大化【代码】

一、去掉标题栏:FormBorderStyle设为None

WinForm窗体的标题栏、边框、最小化最大化关闭按钮,都是由FormBorderStyle属性控制的。这个属性有七个可选值,其中最常用的是FixedSingle、Sizable和None。当设置为FormBorderStyle.None时,窗体会变成一个纯客户区,标题栏、系统按钮、可拖动边框全部消失,这是实现全屏的第一步。

可以在设计器属性面板里直接改,也可以用代码设置。建议用代码,方便在运行时切换全屏和窗口两种状态:

private void btnFullScreen_Click(object sender, EventArgs e)
{
    // 第一步:去掉标题栏和边框
    this.FormBorderStyle = FormBorderStyle.None;
    // 第二步:窗口最大化
    this.WindowState = FormWindowState.Maximized;
    // 第三步:置顶显示,确保覆盖任务栏
    this.TopMost = true;
}

这里有个细节要注意:WindowState设置为Maximized时,窗体的默认行为是铺满工作区,也就是除了任务栏之外的区域。之所以很多教程还要加上TopMost = true,就是因为当窗体没有边框时,配合置顶属性可以压住任务栏,实现真正的全屏。不过这种做法在不同Windows版本上表现略有差异,更稳妥的方案在下一节讲。

二、盖住任务栏的两种可靠方案

单纯依赖Maximized加TopMost,在部分系统上任务栏还是会冒出来,尤其是用户把任务栏设置了自动隐藏又取消的情况。更可靠的做法是手动把窗体的边界设置为整个屏幕的尺寸,也就是Screen.PrimaryScreen.Bounds。

方案一:手动设置边界。这种方式不依赖WindowState,窗体尺寸直接等于屏幕的物理尺寸:

private void EnterFullScreen()
{
    // 保存当前状态,退出时恢复
    _oldState = this.WindowState;
    _oldBounds = this.Bounds;

    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Normal; // 先还原为Normal,避免Maximized状态干扰
    this.Bounds = Screen.PrimaryScreen.Bounds; // 直接铺满整个屏幕
}

private void ExitFullScreen()
{
    this.FormBorderStyle = FormBorderStyle.Sizable;
    this.WindowState = _oldState;
    this.Bounds = _oldBounds;
}

private FormWindowState _oldState;
private Rectangle _oldBounds;

注意进入全屏前先把WindowState设回Normal,这是很多人踩过的坑。如果窗体本身处于Maximized状态,直接修改Bounds是无效的,系统会强制维持最大化布局,结果就是窗体看起来还是没盖住任务栏。先还原Normal再设置边界,就能稳定生效。

方案二:调用Win32 API。通过P/Invoke调用ShowWindow函数,发送最大化命令,无边框窗体在最大化时会覆盖整个屏幕包括任务栏:

[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

private const int SW_MAXIMIZE = 3;

private void btnFull_Click(object sender, EventArgs e)
{
    this.FormBorderStyle = FormBorderStyle.None;
    ShowWindow(this.Handle, SW_MAXIMIZE); // API级最大化,必定覆盖任务栏
}

两种方案对比:手动设置边界方式可控性强,退出全屏时恢复原始位置很方便;API方式代码最短,适合简单的播放器场景。实际项目中建议用方案一,逻辑更清晰。

三、退出全屏与Esc快捷键支持

全屏界面没有标题栏,用户没法点关闭按钮,所以一定要提供退出全屏的途径,最常见的就是按Esc键退出。WinForm里重写ProcessCmdKey方法即可全局拦截按键:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == Keys.Escape)
    {
        if (this.FormBorderStyle == FormBorderStyle.None)
        {
            ExitFullScreen();
            return true; // 表示按键已处理,不再向下传递
        }
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

如果是播放器类应用,还可以加上双击切换全屏的交互,在窗体的DoubleClick事件里判断当前状态并切换。要注意鼠标事件和Esc退出的判断条件保持一致,都以外框样式是否为None作为全屏标志,避免状态混乱。

四、无边框窗体的拖动与多显示器全屏

去掉边框后有个副作用:窗体没法用鼠标拖动位置了。非全屏状态下需要自己实现拖动,重写WndProc处理鼠标消息是最优雅的方式,不用维护额外的事件逻辑:

private const int WM_NCLBUTTONDOWN = 0xA1;
private const int HT_CAPTION = 0x2;

protected override void WndProc(ref Message m)
{
    if (m.Msg == 0x84) // WM_NCHITTEST
    {
        base.WndProc(ref m);
        if ((int)m.Result == 0x1) // HTCLIENT,鼠标在客户区
        {
            m.Result = (IntPtr)HT_CAPTION; // 欺骗系统:把客户区当成标题栏
        }
        return;
    }
    base.WndProc(ref m);
}

这段代码把整个客户区伪装成了标题栏区域,鼠标按住窗体任意位置都能拖动,很多自定义界面库就是这么实现的。如果只想让某个区域可拖动,可以换成MouseEventHandler方案,在MouseDown记录坐标、MouseMove时调整Location。

多显示器场景下,全屏到指定屏幕也很简单,Screen.AllScreens数组存放了所有显示器信息,把Bounds换成目标屏幕的即可:

private void FullScreenOnScreen(int index)
{
    Screen target = Screen.AllScreens[index];
    this.FormBorderStyle = FormBorderStyle.None;
    this.WindowState = FormWindowState.Normal;
    this.Bounds = target.Bounds; // 铺满指定显示器
}

需要注意高DPI环境。如果程序没有开启DPI感知,Screen.Bounds返回的是逻辑像素,在高分屏上可能出现铺不满或超出屏幕的问题。解决方法是在项目属性或app.manifest中声明DPI感知,让系统返回真实物理像素,这样全屏尺寸才是准确的。此外WPF的实现思路类似,把WindowStyle设为None、WindowState设为Maximized、再设置ResizeMode="NoResize"即可,遇到任务栏遮挡时同样用手动设置窗口位置尺寸的方式解决。把这些方案组合起来,一个稳定可靠的全屏窗体就完成了。

C#全屏显示窗体标题栏FormBorderStyle修改时间:2026-09-10 21:28:57

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/0910/54278.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。