winfrom WM_LBUTTONDOWN+WM_LBUTTONUP模拟不了单击按钮事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winfrom WM_LBUTTONDOWN+WM_LBUTTONUP模拟不了单击按钮事件相关的知识,希望对你有一定的参考价值。

const int WM_CLICK = 0x00F5;
const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONUP = 0x0202;

用PostMessage 如果直接用WM_CLICK 的话,可以模拟出单击按钮的效果,但是如果用WM_LBUTTONDOWN +WM_LBUTTONUP 的话,就只能选中,无法触发单击事件,为什么啊?

看你点的对象是否映射了消息啊。
比如说一个BUTTON,它在MESSAGE MAP中映射了WM_CLICK消息。当它收到WM_CLICK时,会调用映射的方法。如果你没映射WM_LBUTTONDOWN消息,它不管收到多少次你发的消息,可它不知道收到消息后要做什么啊。

POSTMESSAGE发送的LBUTTONDOWN消息和物理鼠标的单击是有区别的。它们不是同一个消息(鼠标单击一次可以同时发送多个消息。)。所以需要你分别进行消息映射。追问

WM_LBUTTONDOWN +WM_LBUTTONUP 加起来不就是click么,WM_CLICK 只能针对按钮,如果不是按钮就只能用WM_LBUTTONDOWN +WM_LBUTTONUP

追答

不是的。
我们单击一次鼠标,就完成了一次CLICK动作。在做这个动作的过程中,存在着三个过程,即:鼠标刚点下(MOUSE_DOWN)、鼠标放开(MOUSE_UP)、鼠标点击完成(MOUSE_CLICK)。
系统分别让这三个过程响应不同的消息,以便我们更精确地控制消息的传递。所以发送WM_LBUTTONDOWN消息不同于发送WM_CLICK消息。

追问

但是在VB里面很多人就用 WM_LBUTTONDOWN +WM_LBUTTONUP 实现了click,不知道为什么,可能是C#机制不一样

追答

实现是可以的。但需要人为去控制,让两个不相干的消息拥有关系。
举个例子,你在接收到WM_LBUTTONDOWN这个消息的时候。这个消息调用的方法可以与WM_CLICK消息调用的方法是同一个方法。写一段伪代码给你看一下。

VOID MOUSE_CLICK(PARAMS...); //这是点击时调用的方法。

WHILE(GETMESSAGE())

SWITCH(MSG)

CASE WM_CLICK:
MOUSE_CLICK(PARAMS...);
BREAK;
CASE WM_LBUTTONCLICK:
MOUSE_CLICK(PARAMS...); //与鼠标点击时做的事情一样,这样它不就是感觉好像LBUTTONDOWN与CLICK是一样的了吗?但事实上是不同的。
BREAK;

追问

我是想用程序去控制另一个程序,也就是说另一个程序不是我写的,我当然改不了他的代码,也就是说winform程序里面,只能用wm_click,不能用WM_LBUTTONDOWN +WM_LBUTTONUP 组合去实现click效果,对么?

参考技术A
WM_LBUTTONDOWN

WM_LBUTTONUP
之间加个时间差.比如停个10ms再执行追问

我在网上找的时候发现 VB你们似乎没有 WM_CLICK 这个消息, 会不会是C#独有的,VB需要用WM_LBUTTONDOWN

WM_LBUTTONUP 来模拟,C#不用, 我在之间加了 sleep也不行

以上是关于winfrom WM_LBUTTONDOWN+WM_LBUTTONUP模拟不了单击按钮事件的主要内容,如果未能解决你的问题,请参考以下文章

vc++.net问题: 如何让STATIC控件接受WM_LButtonDown, WM_LButtonUp, WM_MouseMove的消息?

为啥按下鼠标,拖动鼠标,然后松开鼠标时,对 WM_LBUTTONDOWN,程序有响应,但是对 WM_LBUTTON不响应?

WM_MOUSEWHEELWM_LBUTTONDOWN等父子窗口消息传递陷阱

VC中MFC下的绘图初步解析

Windows的三类消息

10.windows消息机制