WinUI3创建始终置顶无边框全屏窗口(任务栏可见且Win+D不隐藏)
WinUI3 创建始终置顶、保留任务栏且Win+D不隐藏的无边框窗口
核心实现方案
- 放弃使用
CompactOverlay或FullscreenPresenter,改用OverlappedPresenter做基础配置 - 基于系统工作区尺寸设置窗口大小,自动避开任务栏
- 通过Windows原生API实现窗口不被Win+D隐藏,同时配置始终置顶
具体代码实现
- 隐藏标题栏与边框
var appWindow = GetAppWindowForCurrentWindow(); var overlappedPresenter = appWindow.Presenter as OverlappedPresenter; // 同时隐藏边框和标题栏 overlappedPresenter.SetBorderAndTitleBar(false, false); // 可选:锁定窗口大小,禁止用户拖拽调整 overlappedPresenter.IsResizable = false;
- 铺满工作区(自动保留任务栏)
// 获取当前窗口所在显示区域的工作区(已排除任务栏) var workArea = DisplayArea.GetFromWindowId(appWindow.Id, DisplayAreaFallback.Primary).WorkArea; // 让窗口铺满整个工作区 appWindow.MoveAndResize(workArea);
- 设置窗口始终置顶
appWindow.IsAlwaysOnTop = true;
- 实现Win+D不隐藏窗口
需要添加P/Invoke调用Windows原生API,先声明API:
[DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll")] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); private const int GWL_EXSTYLE = -20; private const int WS_EX_TOOLWINDOW = 0x00000080; private const int WS_EX_APPWINDOW = 0x00040000;
然后在窗口加载完成后执行:
var windowHandle = WinRT.Interop.WindowNative.GetWindowHandle(this); // 移除应用窗口样式,添加工具窗口样式,避免被Win+D最小化 var exStyle = GetWindowLong(windowHandle, GWL_EXSTYLE); exStyle &= ~WS_EX_APPWINDOW; exStyle |= WS_EX_TOOLWINDOW; SetWindowLong(windowHandle, GWL_EXSTYLE, exStyle);
注意事项
- 所有代码建议在窗口初始化完成后执行,比如
OnLaunched方法或窗口的Loaded事件中 DisplayArea.WorkArea会自动适配不同显示器的任务栏位置,无需手动计算任务栏高度- 工具窗口样式(
WS_EX_TOOLWINDOW)会让窗口不在任务栏显示图标,如果需要保留任务栏图标,可额外处理窗口的显示策略
内容的提问来源于stack exchange,提问作者nullrefexc
相关产品推荐
相关产品推荐

