请问各位高手自定义消息的ID号 是怎样与消息的数据结构关联在一起的呢

const My_OnMove=WM_USRE+100;
type TMYOnMove=Packed Record
     msg:integer;
     left:integer;
  end; 我应用程序内部发送一个消息MY_OnMove   程序怎么知道MY_OnMove的结构是TMYOnMove呢
 是怎么关联在一起的.

解决方案 »

  1.   


    SendMessage( hWnd, MSG_YOUR, wParam, LPARAM( @Rec ) )接受p: PRec;p := PRec( msg.lParam );就是利用这个 LPARAM OR WPARAM(一般用LPARAM) 传一个地址过去就是 接受方 进行类型转换 即可注意 这里用的是 SendMessage 不是 PostMessage, 不然你接受方的数据很可能不正确.
      

  2.   

    知道是这个消息,就知道是这个结构了,自己的程序当然要把协议定好。
    比较简单的方式是定义消息处理函数:procedure MyOnMove( var msg: TMYOnMove ); message My_OnMove;
      

  3.   

    如果想利用消息本身的结构来传值,可利用的最多只有8个字节,也就是WParam和LParam这两个参数,阿贵的方法也不例外。但是如果按照大龙驹的思路这个限制是可以突破的,那就是利用这两个参数来传址,至于大龙驹所说的(这里用的是 SendMessage 不是 PostMessage, 不然你接受方的数据很可能不正确.)也不是觉得的,关键是要搞清楚这两个函数的区别,可以简单理解为同步和异步,我有个例子:
    1.
    type
      TTest = packed record
        Id: Cardinal;
        Name: array[0..9] of Char;
      end;procedure TForm1.Foo(var Msg: TMessage);
    var
      P: ^TTest;
    begin
      P:=Pointer(Msg.LParam);
      Caption:=Format('%d, %s', [P.Id, P.Name]);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      Test: TTest;
    begin
      Test.Id:=47;
      Test.Name:='Leon';
      SendMessage(Handle, WM_USER+1000, 0, Integer(@Test));
    end;2.
    type
      TTest = packed record
        Id: Cardinal;
        Name: array[0..9] of Char;
      end;procedure TForm1.Foo(var Msg: TMessage);
    var
      P: ^TTest;
    begin
      P:=Pointer(Msg.LParam);
      Caption:=Format('%d, %s', [P.Id, P.Name]);
      Dispose(P);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      P: ^TTest;
    begin
      New(P);
      P.Id:=47;
      P.Name:='Leon';
      PostMessage(Handle, WM_USER+1000, 0, Integer(P));
    end;
      

  4.   

    clasj: 你说得一点不错。不过我觉得楼主的意思是怎么知道一个消息对应到它的消息结构,如 
    WM_KEYDOWN -> TWMKeyDown
    WM_GETTEXT -> TWMGetText
    尤其是自定义消息。