WinForm全屏需OnShown中设None边框、Bounds为Screen.PrimaryScreen.Bounds并TopMost=true;WPF需SourceInitialized后调用SetWindowPos置顶至VirtualScreen尺寸,退出时先取消TopMost再恢复窗口状态。
WinForm 窗口启动时立即全屏但保留任务栏
直接设
不够——它只是最大化,不是真正全屏(任务栏仍可见,alt+tab 也能切出)。真全屏得靠
+ 手动撑满屏幕,但必须在窗口已创建、句柄有效后操作,否则会失效。
在
或
事件里设置,别在构造函数或
后立刻设
和
用
获取准确分辨率,别硬写
——多屏或缩放比例(如 125%)下会错位
加上
防止被其他窗口盖住,但注意:这会让窗口始终在最前,影响用户操作其他程序
WPF 中隐藏标题栏和任务栏的稳定写法
WPF 的
只去掉标题栏,不自动隐藏任务栏;要彻底“沉浸”,得配合
和手动设置
/
,且必须等
事件触发后再操作窗口句柄——这是最容易漏的一步。
必须开启才能用
,否则运行时报错
隐藏任务栏不是靠 WPF 自身属性,而是调用 Win32 API:
把窗口 Z 序置顶,并设
避免抢焦点
多 DPI 场景下,
比
更可靠
退出全屏时恢复任务栏可见性的关键时机
按 Esc 或热键退出全屏,如果只改
或
,任务栏大概率卡在隐藏状态——因为 Windows 任务栏的显示逻辑依赖窗口的
和激活状态,不是单纯样式切换就能触发。
C知道
CSDN推出的一款AI技术问答工具
下载
必须调用
或
让别的窗口(比如桌面)获得焦点,任务栏才会响应显示
还原前先设
,否则即使窗口变小了,任务栏仍被压在下面
WinForm 中建议用
+
组合,顺序不能反
多显示器环境下全屏的常见误判
用
遍历时,容易默认取第一个屏幕(
),但用户可能把主窗口拖到了副屏,此时全屏会错跑到主屏上。
正确做法是根据窗口当前所在屏幕获取边界:
(WinForm)或
(WPF)
WPF 中
返回的是“可用区域”(已扣除任务栏),全屏时要用
系列属性
远程桌面或某些显卡驱动下,
可能返回错误值,建议加一层 fallback 判断
任务栏是否真正隐藏,不取决于你设了什么属性,而取决于 Windows 是否认为你的窗口“正在独占桌面”。这个判断藏在窗口消息循环和 Z order 层级里,很多看似生效的操作其实只是表面变化。
windowstate = formwindowstate.maximizedformborderstyle = formborderstyle.noneOnLoadShownInitializeComponentSizeLocationScreen.PrimaryScreen.Bounds1920x1080TopMost = trueprotected override void OnShown(EventArgs e) {
base.OnShown(e);
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Normal; // 先还原,再重设尺寸
this.Bounds = Screen.PrimaryScreen.Bounds;
this.TopMost = true;
}WindowStyle="None"ResizeMode="NoResize"WidthHeightSourceInitializedAllowsTransparency="True"WindowStyle="None"InvalidOperationExceptionSetWindowPosSWP_SHOWWINDOW | SWP_NOACTIVATESystemParameters.VirtualScreenHeightScreen.Boundsprivate 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);
}FormBorderStyleWindowStyleZ orderSetForegroundWindowFocus()TopMost = falsethis.WindowState = FormWindowState.Normalthis.FormBorderStyle = FormBorderStyle.SizableScreen.AllScreens[0]Screen.FromControl(this).BoundsScreen.FromHandle(hwnd)SystemParameters.WorkAreaVirtualScreenScreen.PrimaryScreen