■流水□ » 日志 » bug纪录:程序在任务栏特定情况下没有显示
bug纪录:程序在任务栏特定情况下没有显示
kumbayaco 发表于 2009-07-28 18:18:43
现象是这样的:在windows7和vista下,程序A。A在状态1下,用户摁键WIN+L、CTRL+ALT+DEL,出现类似注销页面,此时A程序弹出一个提示框,因为该页面的特殊性,提示框在后台显示,用户点取消后进入正常系统,此时bug出现,A弹出的对话框在任务栏没有显示。
check代码,发现有一个地方写得有问题,它是这样写的:
ModifyStyleEx(0, WS_EX_TOOLWINDOW | WS_EX_APPWINDOW);
根据MSDN,WS_EX_TOOLWINDOW的效果是使对话框在任务栏没有显示(!!),并且不出现在用户按alt+tab产生的提示框中。而WS_APP_WINDOW的效果是当对话框可见时,将对话框的顶层窗口在任务栏中显示出来(!!)。也就是说这两个STYLE是矛盾的。去掉WS_EX_TOOLWINDOW,bug就不复现了。
bug解决了,还有一个问题,为什么在后台弹出来的窗口就不显示在任务栏了呢?在xp下正常,为什么在vista和windows7下就异常呢?
继续对比,用spy++查看任务栏窗口收到的消息,只截TB_INSERBUTTONA(W)消息。顾名思义,这个消息就是用来往任务栏增加按钮的。
首先,在windows7测试,奇怪,spy++根本抓不到任务栏的任何消息,包括其他普通的消息。有可能时win7对任务栏做了屏蔽,不让外部程序hook?
继续,在vista测试,能捕获到消息。模拟bug复现过程,发现在后台弹出窗口时,任务栏并未接收到TB_INSERBUTTON的消息。而在普通情况下,弹出窗口时,任务栏会收到该消息。
有些眉目了,继续测试xp。结果,在后台弹出窗口时,任务栏也能接收到消息。
原来如此,那就暂且认为是xp、vista、win7之间的不同造成的吧。
现在突然想起,WS_EX_TOOLWINDOW的实现,应该也就是不给任务栏发送增加按钮的消息吧。WS_EX_APPWINDOW同理
