需要向一个别的应用程序中的输入框写信息,没有他们的源程序代码,可以做到吗?请高手指点

解决方案 »

  1.   

    需要找到输入框的句柄,再用SetText
      

  2.   

    第一步。用findwindow得到别的程序的窗口句柄,可以用spy++看一下窗口的标题和类是什么
    第二步。用Getwindow得到子窗口的句柄,判断是否为你所要的输入框。
    第三步。若不是,再用GetNextWindow遍历所有的子窗口,直到找到所要的输入框。
    第四步。发个wm_settext消息过去进行写信息.
      

  3.   

    用getwindow,findwindow之类的东东拿到那个输入框的句柄,然后用settext。
      

  4.   

    多谢各位!如果想取信息的话是不是就用wm_gettext?
    还有如果是grid或report之类的怎么取信息呢?
      

  5.   

    获得它的类,判断是否属性 sender as grid,
      

  6.   

    my god,怎么跟我的问题一模一样.哈哈,帮你up.也帮我自己up哈.
    http://expert.csdn.net/Expert/topic/1203/1203057.xml?temp=.4274408
      

  7.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Timer1: TTimer;
        Button1: TButton;
        Button2: TButton;
        procedure Timer1Timer(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Timer1Timer(Sender: TObject);
    var
     H:HWND;
     p:TPoint;
    begin
      GetcursorPos(P);
      H:=WindowFromPoint(P);
      SendMessage(H,WM_SETTEXT,0,Integer(edit1.Text));
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      timer1.Enabled:=true;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      timer1.Enabled:=false;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      timer1.Enabled:=false;
    end;end.
      

  8.   

    以下是得到别的程序的窗口句柄,改变窗口标题,要改变窗口文本框内容同样可以举一反三的例举设置了,程序如下:
    unit unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        button2: TButton;
        ListBox1: TListBox;
        Button1: TButton;
        procedure tutton2Click(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}function GetText(Wnd : HWND) : string;
    var
      textlength : integer;
      text : PChar;
    begin
      textlength:=SendMessage(Wnd,WM_GETTEXTLENGTH,0,0);
      if textlength=0 then
        Result := ''
      else begin
        getmem(text,textlength+1);
        SendMessage(Wnd,WM_GETTEXT,textlength+1,Integer(text));
        Result:=text;
        freemem(text);
      end;
    end;
    function EnumWindowsProc (Wnd: HWND; LParam: LPARAM): BOOL; stdcall;
    var
      st:string;
    begin
      Result := True;
      if (IsWindowVisible(Wnd)) and (GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) and (GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then begin
        st:=GetText(Wnd);
        Form1.Listbox1.items.add(st);
      end;
    end;
    procedure TForm1.tutton2Click(Sender: TObject);
    var
      Param : Longint;
    begin
      Form1.Listbox1.Clear;
      Param := 0 ;
      EnumWindows(@EnumWindowsProc , Param);
    end;procedure TForm1.Button1Click(Sender: TObject);
      function EnumChildWindowsProc(hwnd: Integer; lparam: Longint):Boolean; stdcall;
      var
        buffer: array[0..255] of Char;
      begin
        Result := True;
        GetClassName(hwnd,buffer,256);
        if StrPas(Buffer)='TEdit' then
        begin
          PInteger(lparam)^ := hwnd;
          Result:=False;
        end;
      end;
    var
      Handle: Integer;
      buffer: Array[0..1023] of Char;
    begin
      Handle := FindWindow(nil,pchar(Form1.listbox1.Items[listbox1.ItemIndex]));  
      if Handle<>0 then
      begin
        EnumChildWindows(Handle,@EnumChildWindowsProc,Integer(@Handle));
        SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('这是我的文本')));
      end;
    end;end.
      

  9.   

    to cg1120
    我看你的程序好像是点击button1后将edit1的值写到鼠标移动的地方,我试了一下没有反应,不知道是不是理解有误?
    另外如果目标窗口有多个文本框,又不能用鼠标那该如何判断?
      

  10.   

    1、
    第一个程序是点击button1后定时器开始工作,将edit1的值写到鼠标移动的地方,button2是停止写入
    2、
    得到程序的窗口句柄后就可以例举窗口里的所有子窗口,得到子窗口句柄,就可以向这些窗口写值,具体代码我就不写了
      

  11.   

    to cg1120
    第二个程序ok了
    还有个老问题,如果目标窗口有多个文本框,但又不能用鼠标选择输入到哪个,该如何找到相应的文本框的handle?
      

  12.   

    只要得到了窗口句柄,那么列举窗口中的所有窗口控件应该可以了,只要有了控件的窗口句柄,就可以用SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('这是我的文本')))设置文本框的内容了
      

  13.   

    to cg1120
    这个我理解了。多谢您的耐心指导。我的意思是枚举之后的选择具体控件的过程不能由人工干预,只能由程序根据各个控件的handle来判断是不是我想操作的控件。但各个控件的handle的值是变化的,控件的class也都是TEdit,我想各自之间肯定还有其他区分的方式,所以主要问题是怎么取到它的其他可以区分开的属性
      

  14.   

    有了控件的窗口句柄,就可以得到控件的值,如EDIT的text,caption等值,可以通过这些值来做相应该的处理。
    但这些只对有窗口句柄的控件可行。