我想将另外一个程序窗口中的某个按钮触发一下,不知如何实现?
想过用SendMessage,如SendMessage(handle, WM_KEYDOWN, vKey, lParam);
可是按钮的handle在程序每次启动后都会发生变化,该怎么办呀?

解决方案 »

  1. 得到按钮的 handle 后 模拟鼠标按下SendMessage(handle,WM_LBUTTONDOWN,MK_LBUTTON,0);SendMessage(handle,WM_LBUTTONUP,0,0);
      

  2. 先用findwindow和findwindowex找到该按钮的句柄。再用sendmessage.
      

  3. 你每次控制都得去重找,下面是在QQ对话模式下控其发送按钮,代码可在
    http://www.xmflyfish.com/awind/qqmsg.rar下载
    var
      hw, hb: THandle;  {想要控制的窗体和按钮的句柄}
    ...
    {找想要控制的窗体的句柄}
    function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;
    var
      cName: array[0..180] of Char;
      wName: array[0..32] of Char;
      tHandle: Longword;
    begin
      GetClassName(hwnd, cName, 32);
      GetWindowText(hwnd, wName, 180);
      result := true;
      tHandle := GetWindowLong(hwnd, GWL_STYLE); {判断窗体是否可见}
      if (Pos('聊天中', StrPas(wName)) > 0) and ((WS_VISIBLE and tHandle) > 1) then
      begin
        hw := hwnd;
        result := false;
      end;
    end;
    {找按钮句柄}
    function GetButtonHandle(hwnd: HWND; lParam: LPARAM): Boolean; stdcall;
    var
      cName: array[0..180] of Char;
      wName: array[0..12] of Char;
    begin
      result := true;
      GetClassName(hwnd, cName, 180);
      if StrPas(cName) = 'Button' then
      begin
        GetWindowText(hwnd, wName, 12);
        if StrPas(wName) = '发送(&S)' then
        begin
          hb := hwnd;
          result := false;
        end;
      end;
    end;
    ...
    procedure TfrmSend.btnStartClick(Sender: TObject);
    begin
      EnumWindows(@EnumWindowsProc, 0);
      if hw <> 0 then EnumChildWindows(hw, @GetButtonHandle, 0);
      if hb = 0 then Exit;
      {找到,执行命令}
      SendMessage(hb, WM_LBUTTONDOWN, 0, 0);
      SendMessage(hb, WM_LBUTTONUP, 0, 0);
    end;
      

类似问题 »