首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >dotnet 读 WPF 源代码笔记 ShowInTaskbar 的实现原理

dotnet 读 WPF 源代码笔记 ShowInTaskbar 的实现原理

作者头像
林德熙
发布2026-03-10 17:15:24
发布2026-03-10 17:15:24
550
举报
文章被收录于专栏:林德熙的博客林德熙的博客

本文记录我阅读 WPF 项目了解到的 ShowInTaskbar 的实现原理

在 WPF 里面,通过判断 ShowInTaskbar == false 决定是否在任务栏隐藏窗口图标,其实现原理是创建一个隐藏的窗口,将当前窗口的 Owner 设置为此隐藏窗口而实现

Window.EnsureHiddenWindow 方法里面将创建名为 Hidden Window 的隐藏窗口,这个隐藏窗口的唯一作用就是在 ShowInTaskbar == false 时,被设置为当前窗口的 Owner 从而实现隐藏窗口的功能

代码语言:javascript
复制
        /// <summary>
        ///     Get or create the hidden window used for parenting when ShowInTaskbar == false.
        /// </summary>
        private HwndWrapper EnsureHiddenWindow()
        {
            if (_hiddenWindow == null)
            {
                _hiddenWindow = new HwndWrapper(
                    0, // classStyle
                    NativeMethods.WS_OVERLAPPEDWINDOW, // style
                    0, // exStyle
                    NativeMethods.CW_USEDEFAULT, // x
                    NativeMethods.CW_USEDEFAULT, // y
                    NativeMethods.CW_USEDEFAULT, // width
                    NativeMethods.CW_USEDEFAULT, // height
                    "Hidden Window", // name
                    IntPtr.Zero,
                    null
                );
            }

            return _hiddenWindow;
        }

在 ShowInTaskbar 变更的时候,将先调用 EnsureHiddenWindow 方法让 _hiddenWindow 完成执行初始化,而后再调用 SetOwnerHandle(_hiddenWindow.Handle); 将隐藏窗口为当前的窗口的 Owner 从而实现在任务栏隐藏窗口图标的功能

代码语言:javascript
复制
        /// <summary>
        ///     The DependencyProperty for ShowInTaskbarProperty.
        ///     Flags:              None
        ///     Default Value:      true
        /// </summary>
        public static readonly DependencyProperty ShowInTaskbarProperty =
                DependencyProperty.Register("ShowInTaskbar",
                        typeof(bool),
                        typeof(Window),
                        new FrameworkPropertyMetadata(BooleanBoxes.TrueBox,
                                new PropertyChangedCallback(_OnShowInTaskbarChanged),
                                new CoerceValueCallback(VerifyAccessCoercion)));

        private static void _OnShowInTaskbarChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Window w = (Window)d;

            Debug.Assert(w != null, "DependencyObject must be of type Window.");
            w.OnShowInTaskbarChanged();
        }

        private void OnShowInTaskbarChanged()
        {
            ...
                    SetTaskbarStatus();
            ...
        }

        /// <summary>
        ///     sets taskbar status
        /// </summary>
        private void SetTaskbarStatus()
        {
            if (ShowInTaskbar == false) // don't show in taskbar
            {
                // To remove the taskbar button for this window it needs to have a non-null parent
                // (we'll create a hidden window for this purpose) and not have WS_EX_APPWINDOW

                // Create this now, even if we're not currently going to parent it.
                // If the Owner changes, we'll need to switch to this.
                EnsureHiddenWindow();

                // when this window is unowned
                if (_ownerHandle == IntPtr.Zero)
                {
                    SetOwnerHandle(_hiddenWindow.Handle);

                    ...
                }

                ...
            }
            else // (ShowInTaskbar == true) show in task bar
            {
                ...
            }
        }

更多关于 ShowInTaskbar 请参阅:

WPF 设置 ShowInTaskbar 对窗口最小化的影响

当前的 WPF 在 https://github.com/dotnet/wpf 完全开源,使用友好的 MIT 协议,意味着允许任何人任何组织和企业任意处置,包括使用,复制,修改,合并,发表,分发,再授权,或者销售。在仓库里面包含了完全的构建逻辑,只需要本地的网络足够好(因为需要下载一堆构建工具),即可进行本地构建

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档