如题

解决方案 »

  1.   

    这个问题我很早就回答过,以计算器为例
    傻瓜的办法,先找到计算器的窗口,还找到该窗口的按钮的HWND,一一发送鼠标按下消息type
      TBtnWnd = packed record
        btn_1: HWND;
        btn_plus: HWND;
        btn_equ: HWND;
      end;
      PBtnWnd = ^TBtnWnd;procedure TForm1.Button1Click(Sender: TObject);
      function enum(AWnd: HWND; AParam: LPARAM): BOOL; stdcall;
      var
        buf: array[0..63] of Char;
      begin
        if (GetClassName(AWnd, buf, 64)<>0)
        and SameText(buf, 'Button') then
        begin
          if GetWindowText(AWnd, buf, 64)<>0 then
          begin
            if buf = '1' then
              PBtnWnd(AParam)^.btn_1 := AWnd
            else if buf = '+' then
              PBtnWnd(AParam)^.btn_plus := AWnd
            else if buf = '=' then
              PBtnWnd(AParam)^.btn_equ := AWnd;
          end;
        end;
        Result := True;
      end;
    var
      w: HWND;
      btn_wnd: TBtnWnd;
    begin
      w := FindWindow('SciCalc', '计算器');
      if w<>0 then
      begin
        FillChar(btn_wnd, sizeof(btn_wnd), 0);
        EnumChildWindows(w, @enum, Integer(@btn_wnd));
        if (btn_wnd.btn_1<>0)
        and(btn_wnd.btn_plus<>0)
        and(btn_wnd.btn_equ<>0) then
        begin
          SendMessage(btn_wnd.btn_1, WM_LBUTTONDOWN, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_1, WM_LBUTTONUP, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_plus, WM_LBUTTONDOWN, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_plus, WM_LBUTTONUP, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_1, WM_LBUTTONDOWN, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_1, WM_LBUTTONUP, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_equ, WM_LBUTTONDOWN, MK_LBUTTON, 0);
          SendMessage(btn_wnd.btn_equ, WM_LBUTTONUP, MK_LBUTTON, 0);
        end;
      end;
    end;
    运行后,计算器得出正确的值:2