registerwindowsmessage,然后广播
通过sendmessage发消息,但怎么把他附加上去?
请给出具体步骤

解决方案 »

  1.   

    发送者:
    var
      SendText: string;
      SendDataStruct: CopyDataStruct;
    begin
      SendText := 'Send';
      SendDataStruct.cbData := length(Sendtext);
      SendDataStruct.lpData := @SendText[1];
      SendMessage(FindWindow(PCHAR('TForm1'), PCHAR('form1')), WM_CopyData, Application.Handle, lparam(@SendDataStruct));
    end;接收者:
        procedure DataIn(var DataMessage: TWMCopyData); message wm_copydata;procedure DataIn(var DataMessage: TWMCopyData); 
    var
      ReceieveData : CopyDataStruct;
      temp: pchar;
      ReceieveStr : string;
    begin
      ReceieveData := DataMessage.CopyDataStruct^;
      temp := ReceieveData.lpdata;
      ReceieveStr := string(temp);
    end; 
      

  2.   

    发送的:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure WndProc(var Message: TMessage); override;  
        { Public declarations }
      end;const UserMessageStr = 'testmsg';
    var
      Form1: TForm1;
      UserWindowHandle : THandle = 0;
      UserMessage : UINT;
    implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);
    begin
      if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then
      begin     // 客户发过来的消息
        UserWindowHandle := Message.wParam;
        ReplyMessage(0);    // 回应消息 , 因为SendMessage是一个阻塞函数,就是要等回应后才继续执行
      end;
      inherited;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var i : integer;
        ds: TCopyDataStruct;  // WM_COPYDATA所需要的结构
        str : string;
    begin
        if UserWindowHandle = 0 then
        begin
            SendMessage(HWND_BROADCAST,UserMessage,handle,0);  // 进行广播
            i:=1;
            while(i<=20) and (UserWindowHandle=0) do
            begin
               label3.caption := '正在连接用户程序,已试'+inttostr(i)+'次';
               application.ProcessMessages;
               sleep(100);
               i := i+1;
            end;
            if UserWindowHandle=0 then //等待回应失败
            begin
                   Showmessage('连接用户程序失败');
                   exit;
            end;
                // 已经连接到用户程序
            label3.caption := '连接用户程序成功!';
            application.ProcessMessages;
         end;
         str := edit1.text;
         ds.cbData := Length (str) + 1;
         GetMem (ds.lpData, ds.cbData ); //为传递的数据区分配内存
         StrCopy (ds.lpData, PChar (str));
         SendMessage(UserWindowHandle,WM_COPYDATA,handle,Cardinal(@ds));  // 已经连接过,直接发消息
         freemem(ds.lpdata);
         label3.caption := '已经发送!';
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息
    end;end.
      

  3.   

    接收:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Label1: TLabel;
        Edit1: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        procedure WndProc(var Message: TMessage); override;
        procedure Mymessage(var t:TWmCopyData);message WM_COPYDATA;
        { Public declarations }
      end;const UserMessageStr = 'testmsg';
    var
      Form1: TForm1;
      UserWindowHandle : THandle = 0;
      UserMessage : UINT;implementation{$R *.DFM}{ TForm1 }procedure TForm1.WndProc(var Message: TMessage);
    begin
      if(Message.Msg = UserMessage) and (Message.wParam <> Handle) then
      begin     // 对方发过来的消息
        UserWindowHandle := Message.wParam;
        ReplyMessage(0);    // 回应消息
        SendMessage(UserWindowHandle, UserMessage, Handle, 1);
      end;
      inherited;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
       UserMessage := RegisterWindowMessage(UserMessageStr); // 注册消息
    end;procedure TForm1.Mymessage(var t: TWmCopyData);
    var str : string;
    begin
        if t.From = UserWindowHandle then // 确认是从对方发过来的
        begin
            str := strpas(t.CopyDataStruct^.lpData);
            ReplyMessage(1);
            Edit1.text := str;
        end;
    end;end.