<00001> 00070356 S WM_MOUSEACTIVATE hwndTopLevel:000B0352 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00002> 00070356 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00003> 00070356 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:25 yPos:15
<00004> 00070356 P WM_LBUTTONUP fwKeys:0000 xPos:25 yPos:15
<00005> 00070356 S WM_MOUSEACTIVATE hwndTopLevel:000B0352 nHittest:HTCLIENT uMsg:WM_LBUTTONDOWN
<00006> 00070356 R WM_MOUSEACTIVATE fuActivate:MA_ACTIVATE
<00007> 00070356 P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:25 yPos:14

这是使用Spy++对RichEdit的鼠标事件的监视(排除了WM_SETCURSOR和WM_MOUSEMOVE),00001-00004是普通的一次鼠标点击,结果也符合预期,WM_LBUTTONDOWN 和 WM_LBUTTONUP 消息成对出现。00005-00007是对选中文本进行了拖拽(期间:先LBUTTONDOWN 后 LBUTTONUP ),但是操作系统只给RichEdit发送了WM_LBUTTONDOWN 消息,WM_LBUTTONUP没有发送。莫名其妙!哪位高手知道怎么回事,请指教。

解决方案 »

  1.   

    那当然了,WM_LBUTTONDOWN是在你按下鼠标左键时就发生了,拖拽时你还没有放成左键肯定不会触发WM_LBUTTONUP消息。而此时发生的是MOUSEMOVE消息。
      

  2.   


    我没写清楚吧,情况是这样:拖拽都完成了,mouse当然已经up了。但是WM_LBUTTONUP没有被发送。
      

  3.   

    要跟踪一下这个消息。TrackMouseEvent
      

  4.   


    个人猜想这个我看就是因为拖拽的原因吧
     
    已经不是简单的鼠标放开的处理了被其他的消息先处理了(这个处理顺便就把UP该做的额事做了) 然后绕过了没发送UP的消息  要不你不选择文本 直接拖拽鼠标试试应该有UP消息发送你这拖动的是一个定义好的“块”可能就转发的别的消息处理的吧我完全想象的 这块我也不熟悉
      

  5.   

    你释放鼠标的时候,鼠标不在你的客户区了吧,如果是那样的话,你的应用程序是捕获不到WM_LBUTTONUP消息的
      

  6.   


    在客户区。各位用写字板和Spy++做一次测试就知道了。
      

  7.   

    我在一个偶然的调试中时候,得到了答案,而且通过了Spy++做的验证。RichEdit在处理拖拽的时候(WM_LBUTTONDOWN )把鼠标捕捉到了一个大小为0的一个窗口上,因为为大小为0所以我们看不见。由于这时候鼠标捕捉到了这个大小为0的窗口上,所有的的鼠标消息,都要发送到这个小窗口上了,所以WM_LBUTTONUP消息不会在发送到原来的 窗口上了。