有个别人的程序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.   

    我给你写个流程吧,我没有条件在delphi里面给你测试,
    一定能够实现你的功能.
    不过你不要干坏事
    第一步
      查找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);
    //思路就这么个思路,用子类化应该能够实现,当然,可以通过模拟鼠标点击,不过不保证可以实现.
      

  2.   

    楼上的老大,我按你的写了,程序的句柄是找到了,但在EnumWindowProc函数里捕捉不到'TSnEdit'类,不知怎么回事,你帮我看看,并且EnumWindowProc也只执行一次就退出了,下面是我按你的写的。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   =   '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;
      

  3.   

    我的一点看法。先看看这个回调函数中的几个问题:
    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也只执行一次就退出了 ”,在回调函数中,将你得到的句柄保存起来,以后就不用再枚举了。