如何将文字信息,模拟人工输入到指定窗口?
具体是,有一个application!,有一个信息录入窗口,然后有一个“保存”键,我想用另外一个程序application2,实现从另外一个数据库提取文字信息,输入到application1的那个信息录入窗口。 
application1可以最小化窗口,并非一直是当前窗口,请问怎么实现。

解决方案 »

  1.   

    大概有这两种方法1.模拟按键
    2.发送消息,类似于SetWindowsText,
      

  2.   

    如果两个程序你都可以编程控制,那方法就太多了
    1、直接用DDE
    2、发送WM_COPYDATA消息
    3、自己来实现一个类似WM_COPYDATA的消息,其实就是内存映射配合消息
    4、使用FindWindow这些函数找到目标句柄,然后发送消息实现
    5、还有一些乱七八糟的办法。如果目标程序你无法控制,那上述方法4可以考虑。
      

  3.   

    wudi_1982(︻┳═一) 可以说详细点嘛?可以给出参考代码吗?谢谢!
      

  4.   

    给你一个用COPYDATA实现的发送端代码如下:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      cpt : TCopyDataStruct;
      Findhd : THandle;
    begin
     //  ShowMessage(inttostr(length(Edit1.Text)));   Findhd := FindWindow(nil,pchar('GetCopyData'));
       if Findhd <> 0 then
       begin
          cpt.cbData := length(Edit1.Text)+1;
          GetMem(cpt.lpData,cpt.cbData);
          StrCopy(cpt.lpData,pchar(Edit1.Text));
          SendMessage(Findhd,WM_COPYDATA,Handle,Cardinal(@cpt));
          FreeMem(cpt.lpData);
       end else showmessage('没有找到目标窗口');end;接收端代码如下:
    unit Getdata;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
      private
        procedure MyCopyDataMessage(var msg : TWMCopyData);message wm_copydata;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.MyCopyDataMessage(var msg: TWMCopyData);
    beginEdit1.Text := StrPas(msg.CopyDataStruct^.lpData)
    end;end.
    接收端的窗体Caption为GetCopyData
      

  5.   

    怎么会收不到呢????在任务栏一样可以啊。好好看看代码,
     Findhd := FindWindow(nil,pchar('GetCopyData'));
    如果说你当前还有其他caption为 GetCopyData的窗体,findWindow可能找到的就是它的句柄,所以你那个程序没有收到,这种情况,最可能出现的就是在你调试程序的时候,你DELPHI中正在调试这个接受端程序,而你又打开了一个接受端程序,这个时候会又两个叫GEtCopyData的窗体,所以你的收不到,并且不会显示‘'没有找到目标窗口'’的这个对话框。如果不嫌麻烦,干脆自己利用内存映射做一个共享数据空间,然后配合自定义的消息实现。wm_copydata其实也是这么实现的,或者你还可以用剪切板,DDE之类。关于DDE,给你个例子服务器端如下:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DdeMan;type
      TForm1 = class(TForm)
        DdeServerConv1: TDdeServerConv;
        DdeServerItem1: TDdeServerItem;
        Edit1: TEdit;
        Button1: TButton;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure DdeServerItem1PokeData(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    DdeServerItem1.Text := Edit1.Text;
    end;procedure TForm1.DdeServerItem1PokeData(Sender: TObject);
    begin
       Edit2.Text := DdeServerItem1.Lines.Strings[0];
    end;end.
    服务器端窗体文件
    object Form1: TForm1
      Left = 192
      Top = 110
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Edit1: TEdit
        Left = 192
        Top = 24
        Width = 121
        Height = 21
        TabOrder = 0
        Text = 'Edit1'
      end
      object Button1: TButton
        Left = 352
        Top = 16
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
      end
      object Edit2: TEdit
        Left = 192
        Top = 120
        Width = 121
        Height = 21
        TabOrder = 2
        Text = 'Edit2'
      end
      object DdeServerConv1: TDdeServerConv
        Left = 192
        Top = 72
      end
      object DdeServerItem1: TDdeServerItem
        ServerConv = DdeServerConv1
        OnPokeData = DdeServerItem1PokeData
        Left = 240
        Top = 72
      end
    end客户端代码:unit Unitc;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DdeMan, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Button1: TButton;
        DdeClientItem1: TDdeClientItem;
        DdeClientConv1: TDdeClientConv;
        procedure FormCreate(Sender: TObject);
        procedure DdeClientItem1Change(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
    DdeClientItem1.DdeConv := DdeClientConv1;
    //PServer是服务器端的进程名,你把上面的服务器端程序保存为PServer就可以了
    if DdeClientConv1.SetLink('PServer','DdeServerConv1')=false then
    begin
      showmessage('连接失败!');
      Exit;
    end;
    DdeClientItem1.DdeItem := 'DdeServerItem1';
    DdeClientConv1.OpenLink;
    end;procedure TForm1.DdeClientItem1Change(Sender: TObject);
    begin
       Edit1.Text := DdeClientItem1.Text;
    end;end.窗体文件object Form1: TForm1
      Left = 192
      Top = 110
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object Edit1: TEdit
        Left = 232
        Top = 32
        Width = 121
        Height = 21
        TabOrder = 0
        Text = 'Edit1'
      end
      object Edit2: TEdit
        Left = 232
        Top = 80
        Width = 121
        Height = 21
        TabOrder = 1
        Text = 'Edit2'
      end
      object Button1: TButton
        Left = 416
        Top = 24
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 2
      end
      object DdeClientItem1: TDdeClientItem
        DdeConv = DdeClientConv1
        OnChange = DdeClientItem1Change
        Left = 280
        Top = 144
      end
      object DdeClientConv1: TDdeClientConv
        ConnectMode = ddeManual
        Left = 232
        Top = 144
      end
    end