需要向一个别的应用程序中的输入框写信息,没有他们的源程序代码,可以做到吗?请高手指点
解决方案 »
- 大哥哥,大姐姐,点阵:如何将输入的文字转换成指定大小的点阵?
- 如何制作宽度和高度为10000像素的窗体。发现窗体宽度和高度不能超过桌面宽度高度,怎么办呢?
- 问个关于delphi访问.net写的webservice的问题(本人新手第一次提问,希望能得到各位好汉的指教)
- iplot控件修改设置
- 急!在线等,delphi操作excel 如何在页面设置里面设“缩放比例”为70%
- 打印(预览)的时候 如果行的内容过多怎么办?
- 关于程序的打包问题,再线等待
- 有个网友,她好漂亮,来看我,但我实在没时间,现在快没戏了,怎么办!
- 高手请进
- 急!如何在使用query构件查处的结果集中定位到第n条纪录!
- 对sql数据库的更新,急!!!
- 关于在线程中创建和维护窗口的问题----〉〉〉〉〉〉〉〉高手进来!!!!(刚上任的版主一定要来哦!)
第二步。用Getwindow得到子窗口的句柄,判断是否为你所要的输入框。
第三步。若不是,再用GetNextWindow遍历所有的子窗口,直到找到所要的输入框。
第四步。发个wm_settext消息过去进行写信息.
还有如果是grid或report之类的怎么取信息呢?
http://expert.csdn.net/Expert/topic/1203/1203057.xml?temp=.4274408
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.
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.
我看你的程序好像是点击button1后将edit1的值写到鼠标移动的地方,我试了一下没有反应,不知道是不是理解有误?
另外如果目标窗口有多个文本框,又不能用鼠标那该如何判断?
第一个程序是点击button1后定时器开始工作,将edit1的值写到鼠标移动的地方,button2是停止写入
2、
得到程序的窗口句柄后就可以例举窗口里的所有子窗口,得到子窗口句柄,就可以向这些窗口写值,具体代码我就不写了
第二个程序ok了
还有个老问题,如果目标窗口有多个文本框,但又不能用鼠标选择输入到哪个,该如何找到相应的文本框的handle?
这个我理解了。多谢您的耐心指导。我的意思是枚举之后的选择具体控件的过程不能由人工干预,只能由程序根据各个控件的handle来判断是不是我想操作的控件。但各个控件的handle的值是变化的,控件的class也都是TEdit,我想各自之间肯定还有其他区分的方式,所以主要问题是怎么取到它的其他可以区分开的属性
但这些只对有窗口句柄的控件可行。