关于自定义消息:
   const
  WM_MyMsg   = WM_USER + 1000; //整数值:2024现有2个窗口 form1 和 form2 
form2中通过某个事件向form1发送自定义消息 WM_MyMsg 
   Sendmessage(form1.handle,WM_MyMsg,1,2);//看得出 wparam = 1 , lparam = 2 ,测试用,没啥具体意义
form1中能够通过
   procedure Onmymsg(var msg:TMsg);message WM_MyMsg;
接受到该消息并且响应。
  问题是,在form1的onmymsg中,查看 msg的各项成员发现:      
    hwnd = 2024
    message = 1 
    wParam = 2
    lParam = 0 
   ...
细心的读者可以发现,消息的参数传过来全都错位了:
   WM_MyMsg传给了hwnd
   wparam传给了message 
   lparam传给了wparam
   接受到msg的lparam为0了,小弟愚钝,不知何解,请大侠赐教。

解决方案 »

  1.   

    procedure Onmymsg(var msg:TMessage);message WM_MyMsg; 试试
      

  2.   

    你比較一下TMessage和TMsg,就知道差別所在。
    把參數類型改為TMessage才是正確的
      

  3.   

    tmessage是可以的,问题是我想取得源窗口的句柄啊,tmessage中没有源窗口的句柄。我不想占用一个参数。难道是传说中的bug?
      

  4.   

    这与delphi机制有关吧,在delphi里面用的是不带句柄的记录结构,
    TMsg 里面的句柄的作用应该是标示该消息所需要发送的目的窗体,而不是用做LZ所说的需求的吧。然后delphi在派发消息之前就已经取得了该句柄了。
     
      

  5.   

    并不是bug,delphi處理的是Tmessage類型的消息,接收進來後,就沒有handle了。Tmsg是window標準消息結構。
    若你想要知道handle,就把它放在lparam參數里
      

  6.   

    还有这回事,没注意到。如此以来,还不知道以后会有多少明明以为正确无疑,但被Delphi变动后就不确定的事情发生。要小心了。
      

  7.   

    以前我也见过,数据就是不对,
    换成TMessage就可以了
      

  8.   

    delphi的事件处理函数参数里没有句柄。
      

  9.   

    VCL的消息跟Windows消息有些不同,并不只是窗口和可视控件才能接收消息,祖先类为TObject的所有类都可以接收消息。你说TMessage里能包含句柄么?如果是窗口消息,那么Windows根据窗口句柄自动调用该窗口类WNDPROC。你会不知道自己的句柄么?
      

  10.   

    $M家的消息大部分都用stdcall(和cdecl)的方式放寄存器。
    少数为了指针而用了pascal的方式。TMSG就是前者,TMessage就是Delphi把前者翻译成后者。
    建议使用TMessage 。不就是个Handle嘛,以下代码够你花的了。function TDuoMsgAdapter.DuoSendMessage(Kind, Value1,
      Value2: Integer): Integer;
    begin
      Result:=SendMessage(FOwnerHandle,WM_DUOMESSAGE,Kind,MakeLong(Value1,Value2));
    // 解析方法
    // LoWord(lParam);
    // HiWord(lParam);
    end;用MakeLong,你可以传递最多4个Integer再嫌少,就用传 TCopyDataStruct (参考 WM_CopyData)