我在应用程序的特定事件视图中使用下面的代码来模拟鼠标左键单击。
SendMessage(WM_LBUTTONDOWN);
SendMessage(WM_LBUTTONUP);
执行此代码后,将出现鼠标拖动视图。模拟鼠标点击后如何避免此拖动视图?
当我通过SPY ++进行监控时,我得到了两条消息,如下所示:
WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:752 yPos:85
WM_BUTTONUP fwKeys:0000 xPos:752 yPos 85
我怀疑WM_LBUTTONUP消息未正确发送。 什么是fwKeys:0000表示? 在上面的代码中,WM_LBUTTON的sendMessage有什么问题吗?
答案 0 :(得分:1)
首先,如果这是您的真实代码,那么您正在“模拟”鼠标点击不当。与消息本身相比,WM_LBUTTONDOWN
或WM_LBUTTONUP
还有更多内容:消息的wParam
和lParam
值中包含数据。
您可以很容易地看到,如果您花了一秒钟来查看WM_LBUTTONDOWN
和WM_LBUTTONUP
的MSDN页面。他们完全描述 wParam
和lParam
值在此上下文中的含义。顺便说一句,这将也回答你关于Spy ++中“fwKeys”含义的问题。
但实际上,如果你需要模拟鼠标事件,那么按照正确的方式进行操作:调用mouse_event
函数。生活中的全部目的是合成鼠标事件。
关于你的另一个问题:如何禁用拖动视图:它取决于你正在处理什么样的控件。例如,如果您有树视图控件,则可以在控件上设置TVS_DISABLEDRAGDROP
样式,如MSDN中所述。如果你想禁用拖动和放大永久删除该控件,然后在创建控件时设置标志。如果您只想暂时禁用它,在合成输入操作期间,那就有点麻烦了 - 您可以使用CWnd::ModifyStyle
暂时删除TVS_DISABLEDRAGDROP
,但您还需要添加代码以再次启用它,在完成发送合成鼠标移动和后,控件已完成处理。
说了这么多,你究竟想要实现什么目标?可能有一种更简单的方法来解决您要解决的问题。
答案 1 :(得分:0)
感谢您的所有答案和支持。
我正在开发一个已经开发的应用程序,需要这个解决方案。最后我发现WM_LBUTTONDOWN处理程序已在我的视图中定义。这需要时间来执行。由于我使用SendMessage将消息发布到线程的消息队列并立即返回,因此在WM_LBUTTONDOWN完成之前,将调用下一条消息WM_LBUTTONUP。所以WM_LBUTTONUP失败了。
我使用PostMessage如下,
PostMessage(WM_LBUTTONDOWN);
PostMessage(WM_LBUTTONUP);
这解决了我的问题。