前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >点击任务栏图标窗口未展示在前面

点击任务栏图标窗口未展示在前面

作者头像
gaigai
发布2019-12-26 14:08:57
2.1K0
发布2019-12-26 14:08:57
举报
文章被收录于专栏:Windows开发Windows开发

点击任务栏图标,对应的窗口会激活带到前台,笔者在项目中遇到点击任务栏图标一直不起作用,大家未必会遇到该问题,原因不重要,排查过程的思路、工具更重要。

为什么我的程序不行,其它程序可以,它们接收到的消息有什么区别?用SPY++抓取该窗口(应用窗口),观察该窗口在点击任务栏图标时收到的消息,然后抓取其它正常的窗口,也观察其在同样操作下接收到的消息,然后比较。SPY++记录窗口消息的方法:右击窗口,选择菜单Messages,然后点击主菜单Messages->Logging Options,选择Messages标签页,点击Select All按钮,点击OK。

对比正常和不正常的消息后发现,不正常时窗口未收到WM_ACTIVATE消息。WM_ACTIVATE消息的默认处理是将窗口激活带到前台,未接收到WM_ACTIVATE消息就是问题所在。

未接收到WM_ACTIVATE消息,必然是发送给其它窗口,而且这个窗口很有可能是本进程,于是继续观察本进程窗口接收到的WM_ACTIVATE消息,方法:点击主菜单Messages->Logging Options,选择Windows标签页,勾选Windows of Same Process选项,然后选择Messages标签页,勾选WM_ACTIVATE消息,这样消息日志比较少。

观察发现果然是本进程的另外一个窗口接收到WM_ACTIVATE消息,右击WM_ACTIVATE消息查看消息详细内容,里面可以看到哪个窗口接收。SPY++抓取该窗口,发现该窗口是应用窗口的子窗口,右击窗口选择Properties菜单,查看该窗口详细信息,发现窗口的Windows Styles有WS_POPUP,正常应该是WS_CHILDWINDOW。

明明是子窗口为什么会有WS_POPUP呢?这个窗口实现上很可能有问题,走读该窗口相关代码,发现该窗口创建时指定WS_POPUP,然后使用SetParent() API设置它为子窗口。

为什么SetParent() API没有将WS_POPUP改成WS_CHILD呢?仔细阅读MSDN关于SetParent() API的介绍,里面明确提到为了兼容考虑,SetParent() API不会将WS_POPUP改成WS_CHILD,调用方需要自行修改。

显示调用SetWindowLong() API去除WS_POPUP增加WS_CHILD,问题解决。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Windows开发 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档