解决主窗体拖拽移动过程中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函数, 即可解决这个问题。 

原创粉丝点击