使用SendMessage发送鼠标点击事件,为何需要发送两次 SendMessage(hand_button,BM_CLICK,0,0);行不行? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 试了下,和我那发送两次的SendMessage一个效果,也就是说得点两次测试程序才弹一次点击提示…… sendmessage之前 SetForegroundWindow 试试? down up 间加个延时有没有效果啊? 这个也加过的,sleep到1000毫秒都没用的 模拟按钮点击可以发送WM_COMMAND消息,通知码为BN_CLICKEDHWND hand_game = FindWindow(NULL,TEXT("测试文件"));HWND hand_button = FindWindowEx(hand_game,NULL,TEXT("Button"),TEXT("点击"));//得到按钮的句柄int nId = GetDlgCtrlID(hand_button);::PostMessage(hand_game, WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hand_button); 加上这个有效了,但是有几个疑问:1.我之前试过SendMessage前加过SetFocus,是无效的,这个和SetForegroundWindow有什么区别呢?MSDN上说SetForegroundWindow 是将创建目标窗口的线程调到前台,然后接受输入,听上去和SetFocus差不多啊。2.另一个疑问是,我的两次sendmessage应该是被分作了两次使用了吧,第一次用来将目标窗口调到前台,第二次才实现单击。我们实际操作时只要单击一次,是Windows在处理鼠标单击的时候,帮我们做了SetForegroundWindow这个过程。我这样说对么?3.最后一个,我是两次单击发送消息按钮,对方才响应一次。如果我第二点说的对的话,那么我在第一次发送消息后,目标窗口调到前台。然而我再次单击发送消息,前台岂不是又回到了发送程序,则我这样一直SendMessage,应该只是不断的将目标窗口调到前台啊,何以对方还能响应一次呢?乞解答! 我主要是知道为什么sendmessage为何会失效,好像很多人都是靠这种方法软模拟的。再说WM_COMMAND得需要控件ID的,有的时候点击不是控件诶,这样岂不会失效。 1.-->每个gui线程都有自己的活动窗口,而目前被用户点中那个线程活动窗口叫前台窗口(或叫前景窗口)。而创建前台窗口的线程叫做前台线程(或叫前景线程),前台线程拥有比其它非前景线程更高的优先级,会被windows操作系统优先处理。SetFocus可以是前台窗口或者是前台窗口的子窗口(控件)。所以可能无效。2.-->支持你的推断3.-->你已经把窗口设为前景线程了,就可以接收消息并处理了。并不会一直做设为前景线程的动作。你可以试试,sendmessage到该窗口,然后SetForegroundWindow 另外一个窗口,继续sendmessage到该窗口验证下。以上个人观点。供参考。 今天我在VB中也碰到了这个问题。我要关闭运行某个软件之初弹出的“每日提示”对话框,思路就是通过发送关闭消息给该对话框的“关闭”按钮。通过spy++已确定“关闭”按钮是该对话框的子窗口,而且不存在下一级窗口。成功关闭的方案也就是前辈们提出的两种:(1)使用两次sendmessage发送关闭消息(第一次设置为前台窗口,第二次执行关闭行为)。(2)先用SetForegroundWindow将“关闭”按钮窗口设置为前台窗口,再用sendmessage发送关闭消息。受益了,感谢前辈们!:-) 怎么复制一个位图句柄? 找能编写外挂的朋友 请大家帮我指点以下这个函数的不足之处 >>>>>>图形技术学习培训计划!急!UP者绝对有分!不够再加! 为什么打不开注册表? 如何在计算机中实现精确定时5ms 急! 大牛请入!!! 怎样改变窗口和按钮的背景颜色? API/GDI怎么设置用户窗口的背景色?请大家多多指教…… 关于一个C的问题,抓破脑袋想不通! 我把CFont对象的值赋给另一个CFont对象哪里错了 在UDP中使用IOCP,内存以4K的速度增长
HWND hand_game = FindWindow(NULL,TEXT("测试文件"));
HWND hand_button = FindWindowEx(hand_game,NULL,TEXT("Button"),TEXT("点击"));//得到按钮的句柄
int nId = GetDlgCtrlID(hand_button);
::PostMessage(hand_game, WM_COMMAND, MAKEWPARAM(nId, BN_CLICKED), (LPARAM)hand_button);
1.我之前试过SendMessage前加过SetFocus,是无效的,这个和SetForegroundWindow有什么区别呢?MSDN上说SetForegroundWindow 是将创建目标窗口的线程调到前台,然后接受输入,听上去和SetFocus差不多啊。
2.另一个疑问是,我的两次sendmessage应该是被分作了两次使用了吧,第一次用来将目标窗口调到前台,第二次才实现单击。我们实际操作时只要单击一次,是Windows在处理鼠标单击的时候,帮我们做了SetForegroundWindow这个过程。我这样说对么?
3.最后一个,我是两次单击发送消息按钮,对方才响应一次。如果我第二点说的对的话,那么我在第一次发送消息后,目标窗口调到前台。然而我再次单击发送消息,前台岂不是又回到了发送程序,则我这样一直SendMessage,应该只是不断的将目标窗口调到前台啊,何以对方还能响应一次呢?乞解答!
SetFocus可以是前台窗口或者是前台窗口的子窗口(控件)。所以可能无效。
2.-->支持你的推断
3.-->你已经把窗口设为前景线程了,就可以接收消息并处理了。并不会一直做设为前景线程的动作。你可以试试,sendmessage到该窗口,然后SetForegroundWindow 另外一个窗口,继续sendmessage到该窗口验证下。
以上个人观点。供参考。
(1)使用两次sendmessage发送关闭消息(第一次设置为前台窗口,第二次执行关闭行为)。
(2)先用SetForegroundWindow将“关闭”按钮窗口设置为前台窗口,再用sendmessage发送关闭消息。
受益了,感谢前辈们!:-)