初学,对sendmessage的了解比较浅,希望高手可以系统的提供关于这个应用的帮助。
比如:
A窗口里有一个Button和一个Edit。
B窗口里也有一个Button和一个Edit。A窗口的Button发送一个字符串给B窗口,B窗口接收到后显示在Edit里,
然后B窗口再发送回给A窗口一个字符串,A窗口显示在自己的Edit里。如果可以再举个用多线程实现此问题的例子更好。

解决方案 »

  1.   

    在同一进程下:
      A窗口的Button发送一个字符串给B窗口,B窗口接收到后显示在Edit里,
      不需要使用SendMessage,直接在A窗口内定义FormB.Edit1.Text = FormA.Edit1.Text;在不同进程下:
      要实现这样的功能需在A窗口中创建映像文件,然后映射到本进程。
      B窗口要打开映像文件,映射到本进程。
      三个函数:CreateFileMapping, OpenFileMapping, MapViewOfFile, UnMapViewOfFileA和B窗口中各定义
    1、  const WM_MYSENDMSG = WM_USER + 1024;//自定义的消息
    2、 type
          PShared = ^TShared;
          TShared = record
            Data: array [0..255] of char;//使用windows标准字符形式char, char *
          end;var
      Shared: PSharedA窗口中Button事件
    var
      str: PChar;
    begin
      str = PChar(Edit1.Text);
      CopyMemory(@(Share^.data), str, length(str));
      SendMessage(FindWindow(nil, 'B窗口的Caption'), WM_MYSENDMSG, 1, 1));
    end;B窗口中定义过程
      public
        procedure GetFormASendMsg(var msg: TMessage); message WM_MYSENDMSG;//接收并处理WM_MYSENDMSG消息
    begin
        
    end;
      

  2.   

    WM_COPYDATA可以用来传送数据。发送字符串:
    var
      cds: COPYDATASTRUCT;
      str: string;
    begin
      str := ...
      cds.cbData := Length(str)+1;
      cds.lpData := PChar(str);
      SendMessage(self.Handle, WM_COPYDATA, self.Handle, Integer(@cds));
    ...接收字符串:procedure WMCopyData(var Message: TMessage); message WM_COPYDATA;
    ...procedure TForm1.WMCopyData(var Message: TMessage);
    type
      PCOPYDATASTRUCT=^COPYDATASTRUCT;
    var
      pcds: PCOPYDATASTRUCT;
      s: string;
    begin
      pcds := PCOPYDATASTRUCT(Message.lParam);
      s := string(PChar(pcds.lpData));
      ShowMessage(s);
    end;
      

  3.   

    你是否知道两个Edit的句柄呢?如果不知道用自定义消息可以,用内存映射共享数据也可以。如果知道直接用WM_SETTEXT和?WM_GETTEXT两个消息,具体看帮助。