我调用一个EXE应用程序,在这个程序弹出输入框的时候,我想把做的DELPHI程序中的字符串STR赋到这个输入框中,不知道能否这样做,或者有其他的办法?
谢谢!
谢谢!
解决方案 »
- 如何不查询数据库而直接筛选DBGRID里面的数据?
- 初到贵宝地!散分!!!
- sql 语句中可以有变量吗???
- 怎样设置得窗体上的相同的属性?
- 哪里有好一点的工作,开发或管理mes系统的!
- 如何把控制word中的表格
- help~!help~!
- DELPHI中用ADOConnection不通过ODBC去直接连SYBASE数据库如何去做,用SYBASE ASE OLE DB FOR PROVIDER 做的时候数据源如何填???
- 比较两幅大小不同的图象,如何确定两幅图象是否相同
- 能否用Delphi程序查看主板及CPU序号
- 关于idhttpserver中ARequestInfo.Document 无法获取网址中的问号
- html打包为可执行文件
procedure TMainForm.SendCardNOTOEdit(const A_sText: string);
var
cn: array[0..255] of Char;
HD: HWND;
T1,T2: DWORD;
begin
(*获得焦点所在窗口句柄,可以是除本身外的所有其他应用程序。
如果焦点所在子窗体中,则获得的是父窗口句柄。*)
HD := GetForegroundWindow;
if HD > 0 then
begin
//通过焦点所在窗口的句柄,获得其线程的标识符
T1 := GetWindowThreadProcessId(HD);
//通过本身的句柄,获得本身的线程的标识符
T2 := GetWindowThreadProcessId(Application.Handle);
//共享焦点
AttachThreadInput(T2,T1,True);
HD := GetFocus;
if (HD > 0) then
begin
GetClassName(HD,cn,Length(cn));
if Trim(cn) = 'TEdit' then //类名
begin
SendMessage(HD,WM_SETTEXT,1,LongInt(PChar(A_sText)));
PostMessage(HD,WM_KEYDOWN,VK_RETURN,0); //发回车命令
end;
end;
//撤销连接
AttachThreadInput(T2,T1,False);
end;
//HD := GetFocus; //如果单独用,只能获得当前应用程序的焦点所在控件的句柄。
end;这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。
再用Sendmessage给那个输入框发送WM_SetText消息
type
TCopyDataStruct = packed record
dwData: DWORD; // 条件
cbData: DWORD; // 信息长度 需要 + 1,加一个结束符的位
lpData: Pointer; // 数据指针,传送数据的地址
end;
var
HD: THandle;
MyCopyDataStruct: TCopyDataStruct;
begin
MyCopyDataStruct.dwData := 1;
MyCopyDataStruct.cbData := StrLen(PChar(Trim(MainForm.edtCardNO.Text))) + 1;
MyCopyDataStruct.lpData := PChar(Trim(MainForm.edtCardNO.Text));
HD := FindWindow(nil,'MainForm');
if HD > 0 then
SendMessage(HD,WM_COPYDATA,Longint(MainForm.Handle),LongInt(@MyCopyDataStruct));
end;接收端:
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;procedure TMainForm.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
begin
FillChar(sText,Length(sText),#0);
StrLCopy(sText, Msg.CopyDataStruct^.lpData, Msg.CopyDataStruct^.cbData);
case Msg.CopyDataStruct^.dwData of
1: RzEdit1.Text := Trim(sText);
2: ShowMessage(sText);
end;
end;
这个我实现不了,我测试过:弹出一个记事本,然后再焦点处把STR的值传过去,但是实现不了。
我要说明一下,我调用的EXE程序不是用DELPHI开发的,这个应该没关系的吧。
把'TEdit'改成'Edit',如果不是delphi写的exe,编辑框的类名不是TEdit,比如PB的就是edit,记事本好像也是edit的类名。
var
h:handle;h:=findwindow(nil,'你要的窗体')
sendmessage(h,MW_str,integer(Pchar('内容1')),Integer(Pchar('内容2')));
接收消息处:
const WM_Str=WM_APP+1;
type
TWMSTR= record
Msg:Cardinal;//该记录对应的消息。
Name:Integer;//内容1
Time:Integer;//内容2;
Result:Longint;
end;
private
procedure OnWMsStr(var MSG:TWMSTR); message WM_Str;
procedure TForm1.OnWMsStr(var Msg: TWMStr);
begin
ShowMessage(String(Pchar(MSG.NAME)));//相应消息 可获得消息参数质
end;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
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)='Edit' then
begin
PInteger(lparam)^ := hwnd;
Result:=False;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Handle: Integer;
begin
Handle := FindWindow(nil,'新建 文本文档 - 记事本');
if Handle<>0 then
begin
EnumChildWindows(Handle,@EnumChildWindowsProc,Integer(@Handle));
SendMessage(Handle,WM_SETTEXT,0,Integer(pchar('这是我的文本')));
end;
end;end.
这个我测试过,你试试看!