WinUI 3中如何将窗口从任务栏中隐藏
在WinUI 3中实现窗口不在任务栏显示
WinUI 3确实没有提供直接可设置的ShowInTaskbar属性,要实现这个需求,需要通过调用Win32 API修改窗口的扩展样式来达成,具体方案如下:
核心思路
带有WS_EX_APPWINDOW扩展样式的窗口会在任务栏显示,而WS_EX_TOOLWINDOW样式的窗口则不会。我们需要通过Win32 API移除窗口的WS_EX_APPWINDOW样式,同时添加WS_EX_TOOLWINDOW样式。
实现步骤与代码
- 添加Win32 API的P/Invoke声明
在项目中创建一个类,包含所需的API调用声明:
using System.Runtime.InteropServices; public static class Win32WindowHelper { private const int GWL_EXSTYLE = -20; private const uint WS_EX_APPWINDOW = 0x00040000; private const uint WS_EX_TOOLWINDOW = 0x00000080; [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); }
- 在窗口加载后修改样式
需要在窗口完成加载、获取到有效句柄后执行样式修改操作,比如在App.xaml.cs的OnLaunched方法中:
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args) { m_window = new MainWindow(); m_window.Activate(); m_window.Loaded += (sender, e) => { // 获取WinUI窗口的底层句柄 IntPtr hwnd = WinRT.Interop.WindowNative.GetWindowHandle(m_window); if (hwnd == IntPtr.Zero) return; // 获取当前窗口的扩展样式 IntPtr currentExStyle = Win32WindowHelper.GetWindowLongPtr(hwnd, Win32WindowHelper.GWL_EXSTYLE); // 移除任务栏显示样式,添加工具窗口样式 uint newExStyle = (uint)currentExStyle.ToInt64() & ~Win32WindowHelper.WS_EX_APPWINDOW | Win32WindowHelper.WS_EX_TOOLWINDOW; Win32WindowHelper.SetWindowLongPtr(hwnd, Win32WindowHelper.GWL_EXSTYLE, (IntPtr)newExStyle); }; }
注意事项
- 必须等待窗口激活并加载完成后再执行样式修改,否则无法获取有效窗口句柄。
- 如果是弹窗类窗口,同样可以在其
Loaded事件中执行上述逻辑。 - 添加
WS_EX_TOOLWINDOW会让窗口标题栏样式略有变化,若想保留原标题栏样式,可尝试仅移除WS_EX_APPWINDOW样式,但这种方式在部分系统环境下可能存在稳定性问题,推荐同时添加WS_EX_TOOLWINDOW。
内容的提问来源于stack exchange,提问作者GHOST
相关产品推荐
相关产品推荐

