WinForm全屏需OnShown中设None边框、Bounds为Screen.PrimaryScreen.Bounds并TopMost=true;WPF需SourceInitialized后调用SetWindowPos置顶至VirtualScreen尺寸,退出时先取消TopMost再恢复窗口状态。
WinForm 窗口启动时立即全屏但保留任务栏
直接设 windowstate = formwindowstate.maximized 不够——它只是最大化,不是真正全屏(任务栏仍可见,alt+tab 也能切出)。真全屏得靠 formborderstyle = formborderstyle.none + 手动撑满屏幕,但必须在窗口已创建、句柄有效后操作,否则会失效。
- 在
OnLoad或Shown事件里设置,别在构造函数或InitializeComponent后立刻设Size和Location - 用
Screen.PrimaryScreen.Bounds获取准确分辨率,别硬写1920x1080——多屏或缩放比例(如 125%)下会错位 - 加上
TopMost = true防止被其他窗口盖住,但注意:这会让窗口始终在最前,影响用户操作其他程序
protected override void OnShown(EventArgs e) {
base.OnShown(e);
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Normal; // 先还原,再重设尺寸
this.Bounds = Screen.PrimaryScreen.Bounds;
this.TopMost = true;
}
WPF 中隐藏标题栏和任务栏的稳定写法
WPF 的 WindowStyle="None" 只去掉标题栏,不自动隐藏任务栏;要彻底“沉浸”,得配合 ResizeMode="NoResize" 和手动设置 Width/Height,且必须等 SourceInitialized 事件触发后再操作窗口句柄——这是最容易漏的一步。
-
AllowsTransparency="True"必须开启才能用WindowStyle="None",否则运行时报错InvalidOperationException - 隐藏任务栏不是靠 WPF 自身属性,而是调用 Win32 API:
SetWindowPos把窗口 Z 序置顶,并设SWP_SHOWWINDOW | SWP_NOACTIVATE避免抢焦点 - 多 DPI 场景下,
SystemParameters.VirtualScreenHeight比Screen.Bounds更可靠
private void Window_SourceInitialized(object sender, EventArgs e) {
var hwnd = new WindowInteropHelper(this).Handle;
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0,
(int)SystemParameters.VirtualScreenWidth,
(int)SystemParameters.VirtualScreenHeight,
SWP_SHOWWINDOW | SWP_NOACTIVATE);
}
退出全屏时恢复任务栏可见性的关键时机
按 Esc 或热键退出全屏,如果只改 FormBorderStyle 或 WindowStyle,任务栏大概率卡在隐藏状态——因为 Windows 任务栏的显示逻辑依赖窗口的 Z order 和激活状态,不是单纯样式切换就能触发。
- 必须调用
SetForegroundWindow或Focus()让别的窗口(比如桌面)获得焦点,任务栏才会响应显示 - 还原前先设
TopMost = false,否则即使窗口变小了,任务栏仍被压在下面 - WinForm 中建议用
this.WindowState = FormWindowState.Normal+this.FormBorderStyle = FormBorderStyle.Sizable组合,顺序不能反
多显示器环境下全屏的常见误判
用 Screen.AllScreens 遍历时,容易默认取第一个屏幕([0]),但用户可能把主窗口拖到了副屏,此时全屏会错跑到主屏上。
- 正确做法是根据窗口当前所在屏幕获取边界:
Screen.FromControl(this).Bounds(WinForm)或Screen.FromHandle(hwnd)(WPF) - WPF 中
SystemParameters.WorkArea返回的是“可用区域”(已扣除任务栏),全屏时要用VirtualScreen系列属性 - 远程桌面或某些显卡驱动下,
Screen.PrimaryScreen可能返回错误值,建议加一层 fallback 判断










