问了好几天的sendmessage了。
现在换个角度问。
就是我想用sendmessage发消息,第二个参数是自定义的。我想在第四个参数传字符串。怎么传啊?
Delphi的sendmessag是已经声明好的了。
如果我自己声明一个
 function SendMessageZ(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: PChar): LRESULT; stdcall;
第四个参数是pchar或string型的行吗?
我试过了,我弄了半天,接收方都得到错误信息。如何能得到正确的呢?

解决方案 »

  1.   

    不同进程之间么?win32下只有WM_COPYDATA可以跨进程传递数据,别的消息没戏,都是在进程自己的独立空间内,无法直接访问其它进程;或者通过ReadProcessMemory来读取其它进程的数据
      

  2.   

    function SendMessageZ(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: PChar): LRESULT; stdcall; 不用再声明了,sendmessage(hwnd,消息,wparam,Lparam(字符串));接收时,string(lParam)就可以
      

  3.   

    自動議的消息需要接收方在 WndProc  裏去載取MSG判斷後處理,如果是在DELPHI下也可以在 Application.OnMessage  裏處理。後者不可以處理POSTMESSAGE,不進隊列的消息
      

  4.   


    unit Unit13737;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
        procedure WMCOPYDATA(var Msg: TWMCopyData); message WM_COPYDATA;
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMCOPYDATA(var Msg: TWMCopyData);
    begin
      ShowMessage(StrPas(Msg.CopyDataStruct.lpData));
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      cds: TCOPYDATASTRUCT;
      S:string;
    begin
      S:='test';
      cds.dwData := 1;
      cds.cbData := Length(S) + 1;
      cds.lpData := nil;
      GetMem(cds.lpData, cds.cbData); //为传递的数据区分配内存
      try
        if cds.lpData <> nil then
        begin
          try
            StrCopy(cds.lpData, PChar(S));
            Windows.SendMessage(Self.Handle, WM_COPYDATA, 0, Integer(@cds));
          except
          end;
        end;
      finally
        if cds.lpData <> nil then
        begin
          FreeMem(cds.lpData); //释放资源end;
        end;
      end;
    end;end.
      

  5.   

    如果发消息时直接写字符串,提示string,和integer类型不匹配
      

  6.   

    5楼的方法不是不能用,而且挺好的。但是在接收方是PB做的,在PB里,不会用COPYDATA,
    如果不用COPYDATASTRUCT的话,不会运行WM_COPYDATA消息标识的函数的。
    我试过了。至于为啥?我还要慢慢研究下WM_COPYDATA
      

  7.   

    进程之间可以传数据的方法不多,如果WM_COPYDATA不行的话,SendMessage后让对方用ReadProcessMemory也并不是一个好的设计,还是老老实实用内存映射文件做吧
      

  8.   

    内存映射文件的方法应该就是WM_COPYDATA吧?
      

  9.   

    仅限于你的问题! 同进程!const
      MYTEST=WM_USER+1002;
    ...... procedure OnMyTest(var message:Tmessage); message MYTEST;......procedure TForm1.Button1Click(Sender: TObject);
    var
      test:string;
    begin
      test:='你看到了吧';
      sendmessage(handle,MYTest,0,Integer(@test));    //发送消息  取test的指针位置
    end;procedure TForm1.OnMyTest(var message: Tmessage);
    begin
      showmessage(string(Pointer(message.LParam)^));  //利用指针重新找到字符串  
    end;~~~~~~~~~~~~~~~~
    用pchar也也一样,更好理解!
      

  10.   

    TTemp = record 
      str :string;
    end;
    PTemp = ^TTemp;
    var
      p :PTemp;
    begin
      new(p);
      sendmessage(hwnd,消息,wparam,Integer(p)); 
    end;接收:
    var
      p :PTemp;
    begin
      p := PTemp(lparam);
      if p<>nil then
      begin
        ...
        ...
        Dispose(p);
      end;
      
    end;