我向另外一个软件的按钮发送模拟点击的信息,用了sendmessage和postmessage两个,如下
postmessage(Hwnd,WM_LBUTTONDOWN,0,0);  //鼠标左键按下
postmessage(Hwnd,WM_LBUTTONUP,0,0);   //鼠标左键抬起
应该怎么修改呢?这个按钮是另外程序的子窗口下的。
非常感谢!

解决方案 »

  1.   

    消息一般都是被窗口接收的,按钮是收不到的,不如把按钮在屏幕的位置计算出来,然后用
    SetCursorPos 把鼠标移过去,用  mouse_event 模拟点击。
    SetCursorPos(600,500);
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
      

  2.   

    是这样的,我不想用通过激活的方法。或者有没有其它的可以发送快捷键的办法,比如说我要对窗口发‘Ctrl+S’。有没有办法的?
      

  3.   

    向按钮的父控件发WM_COMMAND消息:
    SendMessage(Windows.GetParent(按钮句柄), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(按钮句柄), BN_CLICKED), 按钮句柄);或向按钮发送BM_CLICK:
      AttachThreadInput(当前线程id, 目标线程id, True);
      SetActiveWindow(按钮所在窗体句柄);
      AttachThreadInput(当前线程id, 目标线程id, False);
      PostMessage(按钮句柄, BM_CLICK, 0, 0)至于对窗口发‘Ctrl+S’,可以下载sndkey32.pas,调用AppActivate激活窗口,然后SendKeys('^s')
      

  4.   


    使用了第一个方法前面的使用了之后总是出现了raised exception class EcovertError with message"按钮"is not a valid integer value.
      

  5.   

    To 4L:
    按钮句柄怎么写的?StrToInt('按钮')?当然不行了
      

  6.   


    要怎么写,之前我是把句柄转化成string,然后再通过StrtoInt作为句柄直接使用,也没有出现问题。
    按照您思路,该怎么办呢?
      

  7.   

    To 6L:
    你先看看“向按钮的父控件发WM_COMMAND消息”管用不管用吧,直接把按钮句柄写出来,比如:var
      h: HWND;
    begin
      h := $123;
      SendMessage(Windows.GetParent(h), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(h), BN_CLICKED), h);
    end;