使用SendMessage发送鼠标点击事件,为啥需要发送两次

使用SendMessage发送鼠标点击事件,为何需要发送两次
为了测试使用SendMessage发送鼠标消息模拟鼠标点击,我做了一个测试程序,就一个对话框,中间一个按钮,点击后会弹出一个MessageBox,显示一句话“发生点击”。然后又写了另外一个程序,来给这个测试程序发送鼠标点击消息。代码如下:

HWND hand_game = FindWindow(NULL,TEXT("测试文件"));
HWND hand_button = FindWindowEx(hand_game,NULL,TEXT("Button"),TEXT("点击"));//得到按钮的句柄

SendMessage(hand_button,WM_LBUTTONDOWN,0,MAKELPARAM(46,12));
SendMessage(hand_button,WM_LBUTTONUP,0,MAKELPARAM(46,12));

上述代码是实现发送的程序中的一个按钮的响应代码,点击这个发送按钮后,发现测试程序中的按钮得到了焦点,但是为弹出MessageBox……再次点击发送消息的程序中的按钮,这次测试程序弹出了MessageBox,经测试发下,只有两次单击发送消息,或者将代码改成下面的样子:

HWND hand_game = FindWindow(NULL,TEXT("测试文件"));
HWND hand_button = FindWindowEx(hand_game,NULL,TEXT("Button"),TEXT("点击"));//得到按钮的句柄

SendMessage(hand_button,WM_LBUTTONDOWN,0,MAKELPARAM(46,12));
SendMessage(hand_button,WM_LBUTTONUP,0,MAKELPARAM(46,12));
//发送两次:
SendMessage(hand_button,WM_LBUTTONDOWN,0,MAKELPARAM(46,12));
SendMessage(hand_button,WM_LBUTTONUP,0,MAKELPARAM(46,12));

才能正常弹出MessageBox……用SPY++监视按钮得到的消息,发现结果都是正常的……小弟十分不解,望高手解释下!

平台:Visual C++6.0   Windows 7 Ultimate
------解决方案--------------------
sendmessage之前 SetForegroundWindow 试试?
------解决方案--------------------
引用:
引用:
sendmessage之前 SetForegroundWindow 试试?

加上这个有效了,但是有几个疑问:
1.我之前试过SendMessage前加过SetFocus,是无效的,这个和SetForegroundWindow有什么区别呢?MSDN上说SetForegroundWindow 是将创建目标窗口的线程调到前台,然后接受输入,听上去和S……

1.-->每个gui线程都有自己的活动窗口,而目前被用户点中那个线程活动窗口叫前台窗口(或叫前景窗口)。而创建前台窗口的线程叫做前台线程(或叫前景线程),前台线程拥有比其它非前景线程更高的优先级,会被windows操作系统优先处理。
SetFocus可以是前台窗口或者是前台窗口的子窗口(控件)。所以可能无效。
2.-->支持你的推断
3.-->你已经把窗口设为前景线程了,就可以接收消息并处理了。并不会一直做设为前景线程的动作。你可以试试,sendmessage到该窗口,然后SetForegroundWindow 另外一个窗口,继续sendmessage到该窗口验证下。
以上个人观点。供参考。