0

我在应用程序的特定事件视图中使用以下代码来模拟鼠标左键单击。

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 是否有任何错误?

4

2 回答 2

1

首先,如果那是您的真实代码,那么您正在“模拟”鼠标单击不正确。a WM_LBUTTONDOWNorWM_LBUTTONUP不仅仅是消息本身:消息的值wParamlParam值中包含数据。

如果您花一点时间查看 MSDN 页面中的WM_LBUTTONDOWNWM_LBUTTONUP. 它们准确地描述了wParamlParam值在这种情况下的含义。而且,顺便说一句,这将回答您关于 Spy++ 中“fwKeys”含义的问题。

但实际上,如果您需要模拟鼠标事件,那么请以正确的方式进行:调用mouse_event函数。生活中的全部目的是合成鼠标事件。

关于您的另一个问题:如何禁用拖动视图:这取决于您正在处理的控件类型。例如,如果您有一个树视图控件,那么您可以TVS_DISABLEDRAGDROP在控件上设置样式,如MSDN中所述。如果要永久禁用该控件的拖放,请在创建控件时设置标志。如果您只想在合成输入操作期间暂时禁用它,那么这有点棘手 - 您可以使用CWnd::ModifyStyle暂时删除它,TVS_DISABLEDRAGDROP但您还需要添加代码以再次启用它,您完成发送合成鼠标移动控件已完成处理它们。

说了这么多,你到底想达到什么目的?可能有一种更简单的方法可以解决您要解决的问题。

于 2013-05-17T16:36:15.173 回答
0

感谢您的所有回答和支持。

我正在开发一个需要此解决方案的已开发应用程序。最后我发现 WM_LBUTTONDOWN 处理程序已经在我的视图中定义了。这需要时间来执行。由于我使用 SendMessage 将消息发布到线程的消息队列并立即返回,因此在 WM_LBUTTONDOWN 完成之前,将调用下一条消息 WM_LBUTTONUP。所以 WM_LBUTTONUP 失败了。

我使用 PostMessage 如下,

PostMessage(WM_LBUTTONDOWN); 
PostMessage(WM_LBUTTONUP);

这解决了我的问题。

于 2013-05-22T04:13:05.213 回答