我调用一个EXE应用程序,在这个程序弹出输入框的时候,我想把做的DELPHI程序中的字符串STR赋到这个输入框中,不知道能否这样做,或者有其他的办法?
谢谢!

解决方案 »

  1.   

    当然可以啊 sendmessage()不是有个句柄吗 传入接受程序的句柄 在接受程序中写接受事件处理就可以了
      

  2.   

    {发卡信息给焦点所在可编辑框}
    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;这段代码是发送字符串到当前光标所在位置。可以应用于两个不同的程序。你看下,不明白再问。
      

  3.   

    用Findwindow和FindwindowEx找到窗口的句柄
    再用Sendmessage给那个输入框发送WM_SetText消息
      

  4.   

    同一个程序传递字符串的话,可以直接传递,如果是跨进程传递的话,就不能直接传递了,可以考虑内存映像或者WM_COPYDATA消息
      

  5.   

    bdmh提醒了我,还有一个wm_copydata的方法,楼主如果需要我可以贴出来。
      

  6.   

    发送端:
    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;
      

  7.   


    这个我实现不了,我测试过:弹出一个记事本,然后再焦点处把STR的值传过去,但是实现不了。
    我要说明一下,我调用的EXE程序不是用DELPHI开发的,这个应该没关系的吧。
      

  8.   


    把'TEdit'改成'Edit',如果不是delphi写的exe,编辑框的类名不是TEdit,比如PB的就是edit,记事本好像也是edit的类名。
      

  9.   

    const WM_Str=WM_APP+1; 
    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;  
      

  10.   


    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.
    这个我测试过,你试试看!