You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3创建始终置顶无边框全屏窗口(任务栏可见且Win+D不隐藏)

WinUI3 创建始终置顶、保留任务栏且Win+D不隐藏的无边框窗口

核心实现方案

  • 放弃使用CompactOverlay或FullscreenPresenter,改用OverlappedPresenter做基础配置
  • 基于系统工作区尺寸设置窗口大小,自动避开任务栏
  • 通过Windows原生API实现窗口不被Win+D隐藏,同时配置始终置顶

具体代码实现

  1. 隐藏标题栏与边框
var appWindow = GetAppWindowForCurrentWindow();
var overlappedPresenter = appWindow.Presenter as OverlappedPresenter;
// 同时隐藏边框和标题栏
overlappedPresenter.SetBorderAndTitleBar(false, false);
// 可选:锁定窗口大小,禁止用户拖拽调整
overlappedPresenter.IsResizable = false;
  1. 铺满工作区(自动保留任务栏)
// 获取当前窗口所在显示区域的工作区(已排除任务栏)
var workArea = DisplayArea.GetFromWindowId(appWindow.Id, DisplayAreaFallback.Primary).WorkArea;
// 让窗口铺满整个工作区
appWindow.MoveAndResize(workArea);
  1. 设置窗口始终置顶
appWindow.IsAlwaysOnTop = true;
  1. 实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:13