SendMessage(hand_button,BM_CLICK,0,0);
行不行?

解决方案 »

  1.   

    试了下,和我那发送两次的SendMessage一个效果,也就是说得点两次测试程序才弹一次点击提示……
      

  2.   

    sendmessage之前 SetForegroundWindow 试试?
      

  3.   

    down up 间加个延时有没有效果啊?
      

  4.   

    这个也加过的,sleep到1000毫秒都没用的
      

  5.   

    模拟按钮点击可以发送WM_COMMAND消息,通知码为BN_CLICKED
    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);
      

  6.   

    加上这个有效了,但是有几个疑问:
    1.我之前试过SendMessage前加过SetFocus,是无效的,这个和SetForegroundWindow有什么区别呢?MSDN上说SetForegroundWindow 是将创建目标窗口的线程调到前台,然后接受输入,听上去和SetFocus差不多啊。
    2.另一个疑问是,我的两次sendmessage应该是被分作了两次使用了吧,第一次用来将目标窗口调到前台,第二次才实现单击。我们实际操作时只要单击一次,是Windows在处理鼠标单击的时候,帮我们做了SetForegroundWindow这个过程。我这样说对么?
    3.最后一个,我是两次单击发送消息按钮,对方才响应一次。如果我第二点说的对的话,那么我在第一次发送消息后,目标窗口调到前台。然而我再次单击发送消息,前台岂不是又回到了发送程序,则我这样一直SendMessage,应该只是不断的将目标窗口调到前台啊,何以对方还能响应一次呢?乞解答!
      

  7.   

    我主要是知道为什么sendmessage为何会失效,好像很多人都是靠这种方法软模拟的。再说WM_COMMAND得需要控件ID的,有的时候点击不是控件诶,这样岂不会失效。
      

  8.   

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

  9.   

    今天我在VB中也碰到了这个问题。我要关闭运行某个软件之初弹出的“每日提示”对话框,思路就是通过发送关闭消息给该对话框的“关闭”按钮。通过spy++已确定“关闭”按钮是该对话框的子窗口,而且不存在下一级窗口。成功关闭的方案也就是前辈们提出的两种:
    (1)使用两次sendmessage发送关闭消息(第一次设置为前台窗口,第二次执行关闭行为)。
    (2)先用SetForegroundWindow将“关闭”按钮窗口设置为前台窗口,再用sendmessage发送关闭消息。
    受益了,感谢前辈们!:-)