为什么有些任务栏上的按钮一点就消失了

为什么有些任务栏上的按钮一点就消失了

作者:BlogUpdater |  时间:2020-09-14 |  浏览:83 |  评论已关闭 条评论

蝎子
有时候,你会发现这么一个现象:点击任务栏上的一个空白按钮后,这个按钮就消失不见了。这是为什么呢?在MSDN上,有一篇文章《some basic rules on which windows go into the taskbar》做了些介绍,简而言之:
> 如果一个窗口设置了WS_EX_APPWINDOW风格,则它会显示在任务栏上。
> 如果一个窗口是顶级且未被拥有的,则它会显示在任务栏上。
> 其他的所有情况,都不会显示在任务栏上。

(尽管ITaskbarList接口把事情搞得有些复杂),当一个任务栏可感知(taskbar-eligible)窗口变为可见状态时,任务栏将会为这个窗口创建一个按钮。当它变为隐藏状态时,任务栏会移除这个按钮。如果窗口的状态处于任务栏可感知(taskbar-eligible)和任务栏不可感知(taskbar-ineligible)这两种状态之间时,当这个窗口是可见时,则一个空白的按钮会显示在任务栏上。

考虑以下行为模式
> 窗口是任务栏可感知的。
> 窗口如果变为可见状态,则任务栏按钮创建。
> 窗口变成了任务栏不可感知的。
> 窗口变成了不可见状态,因为此时窗口不是任务栏可感知的,所以任务栏忽略了这个变化。

造成的结果
在任务栏会出现一个没有挂接到任何窗口的按钮。这个也是文档会这样建议:”如果你希望将一个窗口的风格进行动态的设置为一个不支持任务栏按钮的风格,你必须先将窗口进行隐藏(通过传入SW_HIDE到ShowWindow中),然后修改窗口的风格,最后显示窗口。”

问题来了
为什么任务栏不对所有窗口的显示和隐藏进行监控呢?

答案
因为这个操作时十分昂贵的。
过滤出不符合任务栏条件的窗口这一动作发生在USER32模块内部,只有当任务栏符合条件的窗口的状态发生了变化,它就通过HSHELL*通知消息来通知任务栏(或任何安装了WH_SHELL钩子的组件)。这样,任务栏代码就不会在没有任何事情可做的情况下被页换入(paged in)。

总结
这里面的状态交互,还挺复杂的哈。等会儿,让我把这事儿给缕缕。。。

最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《What’s with those blank taskbar buttons that go away when I click on them?》

评论已关闭。