自定义SendMessage消息可不可以有返回值?
SendMessage发出消息后
在接受消息后返回一个值,
然后在发消息的处理返回值。
可不可以?
[解决办法]
可以
TMessage = packed record
Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint); //在消息处理中赋值
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
[解决办法]
procedure UserPro(Var Message:TMessage):message WindowsMessage
其中UserPro是用户自定义消息处理函数的名称,WindowsMessage是Windows消息常量或自定义消息常量。
delphi消息需要定义为过程,Message为返回值 TMessage的结构,
TMessage = packed record
Msg: Cardinal;
case Integer of
0: (
WParam: Longint;
LParam: Longint;
Result: Longint); //在消息处理中赋值
1: (
WParamLo: Word;
WParamHi: Word;
LParamLo: Word;
LParamHi: Word;
ResultLo: Word;
ResultHi: Word);
end;
获得返回值:
Message.WParam
Message.LParam
Message.Result
或者
message.WParamLo
...
message.ResultHi
[解决办法]
procedure UserPro(Var Message:TMessage):message WindowsMessage
其中UserPro是用户自定义消息处理函数的名称,WindowsMessage是Windows消息常量或自定义消息常量。
Message是TMessage结构的返回值,结构定义如上面的回复
[解决办法]
楼上两位似乎理解错了楼主的意思。
楼主应该是想知道某个消息发送者在SendMessage一个消息后,能不能获得这个消息接收者返回的消息处理情况值。
SendMessage或者PostMessage只负责将消息送入消息队列,这两个函数的返回值都是关于消息是否正确地送入消息队列的,而不是消息接收者的处理返回值。
接收消息的程序在处理消息之后,如果想返回处理结果,则需要另外发送一个消息(包含处理结果的值)到消息队列,然后(原来的)消息发送者再接收并获得处理情况返回值。
[解决办法]
如楼上所说
[解决办法]
SendMessage和PostMessage的最大区别在于,前者等待消息的处理完,后者则仅仅只是投递到消息队列。所以通常建议的方式是在具有同步需要的时候,采用SendMessage,而这个时候,SendMessage的后面两个参数wParam,lParam就可以用来传送结构数据的指针,从而等到指定的消息处理线程,退出(投递失败),或者处理完成之后可以继续对wParam和lParam参数进行相应的处理。根据这样的处理机制,就可以由接收消息的线程对wParam或lParam所携带的数据指针的内容进行修改(前提是双两结构透明或一致),从而发送消息者也可以对修改后的内容进行进一步处理。
[解决办法]
需要记住的是,可以对消息的返回值进行修改,也可以当wParam或lParam是一个指针的时候,对其所指向的内容进行修改,但是修改wParam或lParam本身的值,将无法实现回传。