如何将文字信息,模拟人工输入到指定窗口?
具体是,有一个application!,有一个信息录入窗口,然后有一个“保存”键,我想用另外一个程序application2,实现从另外一个数据库提取文字信息,输入到application1的那个信息录入窗口。
application1可以最小化窗口,并非一直是当前窗口,请问怎么实现。
具体是,有一个application!,有一个信息录入窗口,然后有一个“保存”键,我想用另外一个程序application2,实现从另外一个数据库提取文字信息,输入到application1的那个信息录入窗口。
application1可以最小化窗口,并非一直是当前窗口,请问怎么实现。
解决方案 »
- cxGrid 录入数据后的新值、旧值,为空值时出错
- 求DXDBGRID的详细使用技巧
- ********下午去百度笔试,考题有二叉搜索树和堆,全不会。大家说这两个东西有用吗,哪里能用上。星星请回答?
- DevExpress中cxGrid使用问题。
- 内存释放问题。
- 请大家不吝赐教:在做多层程序时,老是出现'灾难性故障',原因有哪些?
- 再使用word的窗体里面,一般的界面大家是如何布置?
- 我想修改listview的最后1行,第2列的内容,如何找到listview最后1行》?
- 运程数据模块问题
- 再问"如何判断一个窗口是否被创建"
- 软件发布:SmartSQL 3.2 for MSSQL
- DBGRIDEH的一个小语句!
2.发送消息,类似于SetWindowsText,
1、直接用DDE
2、发送WM_COPYDATA消息
3、自己来实现一个类似WM_COPYDATA的消息,其实就是内存映射配合消息
4、使用FindWindow这些函数找到目标句柄,然后发送消息实现
5、还有一些乱七八糟的办法。如果目标程序你无法控制,那上述方法4可以考虑。
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
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