关于自定义消息:
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了,小弟愚钝,不知何解,请大侠赐教。
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了,小弟愚钝,不知何解,请大侠赐教。
把參數類型改為TMessage才是正確的
TMsg 里面的句柄的作用应该是标示该消息所需要发送的目的窗体,而不是用做LZ所说的需求的吧。然后delphi在派发消息之前就已经取得了该句柄了。
若你想要知道handle,就把它放在lparam參數里
换成TMessage就可以了
少数为了指针而用了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)