WinForms全屏需设FormBorderStyle=None,用SetBounds配合WorkingArea手动布局并TopMost=true;WPF需SourceInitialized中调API清除窗口样式;均须保存/还原原始状态且处理多屏/DPI/快捷键干扰。

WinForms 窗体怎么彻底隐藏标题栏又铺满屏幕
直接设 FormBorderStyle 为 None 并调 WindowState = FormWindowState.Maximized 不行——Windows 会留出任务栏高度,实际没真全屏,顶部还可能漏出像素边。
真正全屏必须绕过系统最大化逻辑,手动拉伸到工作区尺寸:
-
FormBorderStyle = FormBorderStyle.None是前提,否则标题栏和边框无法消失 - 别用
WindowState = Maximized,改用SetBounds直接写死坐标:this.SetBounds(Screen.PrimaryScreen.WorkingArea.X, Screen.PrimaryScreen.WorkingArea.Y, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height) - 记得在
Load事件里执行,且加this.TopMost = true防被其他窗口盖住(尤其全屏播放、监控类场景) - 如果多显示器,
Screen.FromControl(this)比PrimaryScreen更准
C# 全屏时如何禁用 Alt+Tab 和 Win 键
纯窗体设置做不到,得靠 Windows API 拦截系统热键。不处理的话,用户一按 Alt+Tab 就切走,全屏体验直接崩。
关键不是“隐藏”,而是“劫持”:
- 重写窗体的
ProcessCmdKey方法,对Keys.LWin、Keys.RWin、Keys.Tab(配合Alt)返回true表示已处理 - 但
Alt+Tab是系统级快捷键,.NET 层拦截不稳,更可靠的是调用SetThreadExecutionState配合ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED延迟休眠,再用RegisterHotKey抢先注册Alt+Tab组合(需管理员权限,慎用) - 更实际的做法:全屏时把窗体设为
TopMost,并监听Deactivate事件,一旦失焦立刻Activate()拉回——不能防切换,但能减少“卡在外面”的感知
WPF 里实现无边框全屏为什么比 WinForms 还容易踩坑
WPF 的 WindowStyle="None" 看似简单,但默认 ResizeMode="NoResize" 会导致拖拽失效,而设成 CanResize 又会意外出现右下角缩放手柄——这玩意儿在无边框下是透明 UI 元素,用户点一下就触发缩放,窗体瞬间变小。
核心矛盾在于 WPF 窗口生命周期和 DPI 缩放的耦合:
- 必须在
SourceInitialized事件里调用 Win32 APISetWindowLongPtr清掉WS_CAPTION和WS_THICKFRAME样式,仅靠 XAML 不够 - 启用
AllowsTransparency="True"会禁用硬件加速,动画掉帧;不用它,又没法做圆角或半透效果 - 高 DPI 下
SystemParameters.WorkArea返回的是物理像素,而 WPF 坐标是设备无关单位(DIP),直接赋值会导致偏移,得用VisualTreeHelper.GetDpi(this).PixelsPerDip换算
全屏窗体关闭后怎么恢复原来状态
很多代码只管进全屏,不管退——用户按 Esc 或点击按钮退出时,窗体尺寸、位置、边框全乱了,甚至卡在非工作区外。
必须显式保存进入前的状态,并在退出时还原:
- 进全屏前缓存三个值:
originalSize(this.Size)、originalLocation(this.Location)、originalFormBorderStyle(this.FormBorderStyle) - 退出时按顺序还原:先设回
FormBorderStyle,再设Size和Location,最后调Refresh()防界面撕裂 - 如果原窗体是居中显示,别直接设
Location,改用this.StartPosition = FormStartPosition.CenterParent或手动计算屏幕中心坐标 - 注意:WinForms 的
RestoreBounds属性只在WindowState == Normal时有效,全屏状态下读出来是错的,不能依赖
全屏不是设个属性就完事,它本质是绕过窗口管理器的一次手工接管——所有边界条件都得自己兜底,尤其是多屏、DPI 变化、快捷键干扰这些,稍不注意就漏一帧或者卡死焦点。


















