add these web sites

SetCapture后无法收到WM_MOUSEMOVE消息的问题

Posted by micki on July 08, 2018, sorted in Windows Application Development

SetCapture后无法收到WM_MOUSEMOVE消息的问题

SetCapture是SDK中非常重要且非常实用的一个函数, 其作用是在调用者执行SetCapture后即便是鼠标光标移出调用者所在的窗口调用者所设置的HWND依然可以收到带有光标坐标的WM_MOUSEMOVE. SetCapture可让调用者接收到自身进程外的鼠标光标位置信息, 其强大的跨进程鼠标跟踪的特点使得其应用是相当广泛的, 比如实现文件拖动或是画线画图都可能需要用到该函数来跟踪鼠标的运行轨迹. 
 
SetCaputer功能强大, 其常规的使用方法也很简单. 第一步是调用SetCapture, 第二步是在WM_MOUSEMOVE响应函数里处理鼠标轨迹相应应用, 第三步是调用ReleaseCapture释放鼠标. 简简单单的三步便可完成需要Windows钩子才能完成的跨进程功能.
 
SetCaputer基本应用到此为止, 现该说说我今天所碰到的诡异问题, 在调用SetCapture后收不到鼠标移动的WM_MOUSEMOVE消息. 具体实现是这样的: 在一个按钮响应函数里调用SetCapture, 然后按住鼠标左键不放开, 此后便再没接收到WM_MOUSEMOVE消息. 经过好一番测试并到网上查找SetCapture使用相关资料也没能找到问题所在. 最后问题还是找到并解决了, 碰到过该情况的朋友想必也已看到问题所在了, 在按钮按下时系统是不会发WM_MOUSEMOVE消息, 这问提的本身不在于SetCapture, 而是在于按钮按下直到放开按钮, 系统都不会发送WM_MOUSEMOVE消息. 解决之道便是不要在按钮按下时调用SetCapture, 而在按钮范围之外鼠标左键按下时调用SetCaputure.
 
做开发便是这样, 有时看似很简单的问题, 在没到到原因之前也能让人好一翻折腾.

Recent Posts