发送消息的常用函数:
function SendMessage( hWnd: HWND; {目标句柄} Msg: UINT; {要发送的消息(编号)} wParam: WPARAM; {消息参数} lParam: LPARAM {消息参数} ): LRESULT; stdcall; {返回处理结果} function PostMessage( hWnd: HWND; {目标句柄} Msg: UINT; {要发送的消息(编号)} wParam: WPARAM; {消息参数} lParam: LPARAM {消息参数} ): BOOL; stdcall; {是否发送成功} function Perform( Msg: Cardinal; {要发送的消息(编号)} WParam: WPARAM; {消息参数} LParam: LPARAM {消息参数} ): LRESULT; {返回处理结果}
SendMessage 发送消息后会等待处理结果;
PostMessage 把消息送人等待处理的消息队列.
发送 SendMessage 消息好比: 你扔一颗手榴弹到敌群中, 并期待看到血肉横飞的场面;
发送 PostMessage 消息好比: 你在敌人就要路过的地方埋上一颗地雷, 你就不管了.
其实 SendMessage 和 PostMessage 在实用过程中区别并不是很大.
Perform 和上面两个不同, 它是控件的一个方法, 最早定义在 TControl 类, TControl 的子孙都有这个方法, TControl 之上的父类们不需要处理消息, 也没有消息要处理.
Perform 和 SendMessage 更相似, 但貌似少了一个参数, 其实没有, 只是换了一下位置, 看它的调用对比:
SendMessage(控件句柄, 消息, 参数, 参数);
控件.Perform(消息, 参数, 参数);
OnMessage 只响应消息队列中的消息
PostMessage 是把消息放入消息队列.
因为 Application.OnMessage 只接收队列中的消息,
所以 Perform、SendMessage 发送的消息, OnMessage 收不到.
消息和消息参数:
消息就是一个整数, 就是微软给做的一个编号:
0 .. WM_USER-1: Windows 使用
WM_USER .. $7FFF: 窗体类使用
$8000 .. $BFFF: 保留
$C000 .. $FFFF: 应用程序使用
大于 $FFFF: 保留
Delphi 也自定义了一些消息, 分别是 CM_ 和 CN_ 打头.