有个别人的程序A.exe ,其中有个窗口(frmMain: TfrmMain)上有个输入框( object edtCalled: TSnEdit)、一个图片(object imgStartLBS: TImage),一个MEMO控件(object mmoResult: TSnMemo),一个菜单项(object N11: TMenuItem),程序的执行的流程是这样的:
1、在输入框内输入查询内容。
2、单击图片执行查询,查询的结果放在MEMO里
3、如果单击菜单就会把查询结果复制到剪贴板里。现在我自己的程序需要上面所说剪贴板里的数据,我想写一段代码通过消息控制上面a.exe的执行流程,比如在我自己的程序里输入查询内容后,会直接把剪贴板里的内容放到我的程序里。所以请各位兄台帮忙解决一下。下面是那个a.exe反编译后的窗口文件的主要代码。
object frmMain: TfrmMain
.........
略....
........
object AdvOfficePage6: TAdvOfficePage
Left = 1
Top = 2
Width = 228
Height = 115
Caption = 查询
object lbl1: TLabel
Left = 8
Top = 30
Width = 60
Height = 13
Caption = 定单号码:
Transparent = True
end
object imgStartLBS: TImage
Left = 68
Top = 55
Width = 77
Height = 21
Cursor = crHandPoint
AutoSize = True
Picture.Data = {
07544269746D600
07544269746D600
..............
一堆乱糟糟的图形数据略........
..................
07544269746D600
07544269746D600}
OnClick = imgStartLBSClick
end
object edtCalled: TSnEdit
Left = 67
Top = 26
Width = 155
Height = 21
MouseEnterColor = clSkyBlue
MouseLeaveColor = clSkyBlue
TabOrder = 0
OnKeyPress = edtCalledKeyPress
end
object mmoResult: TSnMemo
Left = 591
Top = 2
Width = 319
Height = 127
Align = alRight
MouseEnterColor = clSkyBlue
MouseLeaveColor = clSkyBlue
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
end
object chkStartLBSByLocal: TSnCheckBox
Left = 22
Top = 97
Width = 174
Height = 13
Hint = 选择表示直接对接,非选为直接经过部门服务器
AutoSize = True
Caption = 是否允许以本地直接发起查询
ParentShowHint = False
ShowHint = True
Transparent = True
OnClick = chkStartLBSByLocalClick
end
object N11: TMenuItem
Caption = 复制所有数据
OnClick = N11Click
end
end
end
1、在输入框内输入查询内容。
2、单击图片执行查询,查询的结果放在MEMO里
3、如果单击菜单就会把查询结果复制到剪贴板里。现在我自己的程序需要上面所说剪贴板里的数据,我想写一段代码通过消息控制上面a.exe的执行流程,比如在我自己的程序里输入查询内容后,会直接把剪贴板里的内容放到我的程序里。所以请各位兄台帮忙解决一下。下面是那个a.exe反编译后的窗口文件的主要代码。
object frmMain: TfrmMain
.........
略....
........
object AdvOfficePage6: TAdvOfficePage
Left = 1
Top = 2
Width = 228
Height = 115
Caption = 查询
object lbl1: TLabel
Left = 8
Top = 30
Width = 60
Height = 13
Caption = 定单号码:
Transparent = True
end
object imgStartLBS: TImage
Left = 68
Top = 55
Width = 77
Height = 21
Cursor = crHandPoint
AutoSize = True
Picture.Data = {
07544269746D600
07544269746D600
..............
一堆乱糟糟的图形数据略........
..................
07544269746D600
07544269746D600}
OnClick = imgStartLBSClick
end
object edtCalled: TSnEdit
Left = 67
Top = 26
Width = 155
Height = 21
MouseEnterColor = clSkyBlue
MouseLeaveColor = clSkyBlue
TabOrder = 0
OnKeyPress = edtCalledKeyPress
end
object mmoResult: TSnMemo
Left = 591
Top = 2
Width = 319
Height = 127
Align = alRight
MouseEnterColor = clSkyBlue
MouseLeaveColor = clSkyBlue
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
end
object chkStartLBSByLocal: TSnCheckBox
Left = 22
Top = 97
Width = 174
Height = 13
Hint = 选择表示直接对接,非选为直接经过部门服务器
AutoSize = True
Caption = 是否允许以本地直接发起查询
ParentShowHint = False
ShowHint = True
Transparent = True
OnClick = chkStartLBSByLocalClick
end
object N11: TMenuItem
Caption = 复制所有数据
OnClick = N11Click
end
end
end
一定能够实现你的功能.
不过你不要干坏事
第一步
查找a.exe窗口
var mh:integer;
mh:=findwindow('TfrmMain ', nil);
if mh<> 0 then 开始查找目标程序的tedit,timage和menuitem
获得tedit最好用窗口子类化来处理,方法如下:
function EnumWindowProc(HWD: THandle; LParam: LPARAM): Boolean; stdcall;
var
clsName: array[0..254] of char;
begin
FillChar(clsName, sizeof(clsname), 0);
if GetClassName(HWD, clsName, sizeof(clsname)) > 0 then
begin
if clsName = 'TEdit' then
begin
SendMessage(hwd, WM_CLEAR, 0, 0);
SendMessage(HWD, WM_Paste, 0, 0); //粘帖剪贴板的数据到这里,不过你事先要把自己的数据放到剪贴板,clipboard.astext:= yourEdit.text
end;
if clsname = 'Timage' then
begin end; if clsname = 'Tmemo' then
begin
SendMessage(hwd, WM_Copy, 0, 0);
end; end;
end;
//接 if mh<> 0
EnumChildWindows(mh, @EnumWindowProc, 0);
sleep(100);//稍等一会sendmessage(Yourmemo.handle,wm_past,0,0);
//思路就这么个思路,用子类化应该能够实现,当然,可以通过模拟鼠标点击,不过不保证可以实现.
var
clsName: array[0..254] of char;
begin
FillChar(clsName, sizeof(clsname), 0);
if GetClassName(HWD, clsName, sizeof(clsname)) > 0 then
begin
if clsName = 'TSnEdit' then
begin
SendMessage(hwd, WM_CLEAR, 0, 0);
SendMessage(HWD, WM_Paste, 0, 0); //粘帖剪贴板的数据到这里,不过你事先要把自己的数据放到剪贴板,clipboard.astext:= yourEdit.text
end;
if clsname = 'TImage' then
begin end; if clsname = 'TSnMemo' then
begin
SendMessage(hwd, WM_Copy, 0, 0);
end; end;end;procedure TForm3.Button1Click(Sender: TObject);
var mh:integer;
begin
mh:=findwindow('TfrmMain', nil);
if mh <> 0 then //开始查找目标程序的tedit,timage和menuitem
//获得tedit最好用窗口子类化来处理,方法如下://接 if mh <> 0
begin
EnumChildWindows(mh, @EnumWindowProc, 0);
end;
sleep(100);//稍等一会sendmessage(memo1.Handle,WM_Paste,0,0);
//思路就这么个思路,用子类化应该能够实现,当然,可以通过模拟鼠标点击,不过不保证可以实现.
end;
function EnumWindowProc(HWD: THandle; LParam: LPARAM): Boolean; stdcall;
var
clsName: array[0..254] of char;
begin
Result:= false; //加上这句,如果返回为true, 这个函数就不再执行了 FillChar(clsName, sizeof(clsname), 0); if GetClassName(HWD, clsName, sizeof(clsname)) > 0 then
begin
if clsName = 'TSnEdit' then
begin
SendMessage(hwd, WM_CLEAR, 0, 0);
SendMessage(HWD, WM_Paste, 0, 0); //粘帖剪贴板的数据到这里,不过你事先要把自己的数据放到剪贴板,clipboard.astext:= yourEdit.text
end; if clsname = 'TImage' then //我敢保证你找不到这个控件,它没有句柄的 begin
end; if clsname = 'TSnMemo' then
begin
SendMessage(hwd, WM_Copy, 0, 0);
end;
Result:= true;//加上这句
end;
end; “但在EnumWindowProc函数里捕捉不到 'TSnEdit'类,不知怎么回事,你帮我看看,"可能是控件的类名大小写问题,你可以试试用Pos('TSNE', Uppercase(clsname)) > 0 then,等号的话太绝对了。如果你后边多个空格,就找不到了。你可以在那里设置一个断点,动态察看clsname中的内容,看看有没有找到。 "并且EnumWindowProc也只执行一次就退出了 ”,在回调函数中,将你得到的句柄保存起来,以后就不用再枚举了。