解决主窗体拖拽移动过程中DoModal出来的窗体无法收到鼠标消息问题
来源:互联网 发布:资产负债表数据来源 编辑:程序博客网 时间:2024/06/05 14:37
首先详细说明一下出现问题的情况:
现在有一个基于WTL的主窗体,可以在特定情况下收到用户自定义的消息X,并在处理这个消息X的函数中弹出一个模态窗口。
如果在拖拽主窗体使之不断移动的过程中,收到自定义消息X,在Win7 32位中就会出现一个问题:看上去Explorer卡住了,
点击桌面上的图标没有反应,主窗体和弹出的Child无任何反应,鼠标不能移动到任务栏上。 此时可以通过Ctrl+Alt+DEL使
Explorer恢复正常, 但是我们程序的主窗体和他的Child依然处于假死状态, 不响应任何鼠标点击和移动。
通过Spy++跟踪消息循环发现,因为Child是模态的,主窗体不响应鼠标消息是正常的。但是Child正常应该能收到MouseMove等
鼠标消息。而实际上Child只能收到WM_NCHITTEST,而WM_MOUSEMOVE和WM_LBUTTONDOWN等消息,看上就像系统根本没
有发给Child。
出现这个问题应该是因为拖拽主窗体的过程中,主窗体拥有鼠标等消息的处理权,而DoModal出来的Child窗口在主窗体中的鼠标
状态没有恢复成放开的情况下,强行夺取了对鼠标消息的处理权,导致系统分发消息出现了错误。所以才会出现Explorer也跟着卡死的
现象。
为了解决这个问题,我想到方法是在Child DoModal出来之前, 让主窗体主动放弃对鼠标的所有权。实践发现只要在子窗口
调用DoModal之前, 主窗口调用ReleaseCapture函数, 即可解决这个问题。
- 解决主窗体拖拽移动过程中DoModal出来的窗体无法收到鼠标消息问题
- DLL子窗体收到的消息
- 简单的鼠标移动窗体
- DoModal出来的窗口往主窗口发送消息
- 移动窗体的函数,在窗体的WM_LBUTTONDOWN消息中,响应下面的函数
- 向鼠标所在的窗体发送消息
- Qt:通过鼠标拖拽,来移动无边框窗体
- 使得窗体无法移动
- 自定义处理窗体的移动消息WM_MOVE
- 关闭窗体消息过程
- TCP客户端无法收到消息的问题。
- Winfrom窗体在去掉窗体边框的情况下使鼠标移动窗体
- 设置鼠标可以移动窗体
- 窗体上鼠标移动画线
- duilib 鼠标点击窗体移动
- MFC对话框禁止移动 使标题栏不响应鼠标消息 通过客户区移动窗体 OnNcHitTest()的实现
- 窗体移动(消息欺骗应用)
- 如何解决嵌入式directfb的鼠标无法移动问题_20120507
- windows 7系统进程详解
- zoj 2724 Windows Message Queue
- ASP.NET页面如何建立静态缓存
- 转:TinyXml快速入门
- linux 本地添加/删除软件
- 解决主窗体拖拽移动过程中DoModal出来的窗体无法收到鼠标消息问题
- P2P中的Chord算法
- 优秀程序员的十个习惯
- 觉得不错的忠告
- sql断点查询
- 黑客与画家
- libtool的作用及应用 (转载)
- STL算法交集、并集、差集
- 2011年的第一篇文章