发送消息函数对比 (转自:万老师的博客)

发送消息的常用函数:


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 只响应消息队列中的消息

Perform、SendMessage 会直接发送消息到窗体过程;
PostMessage 是把消息放入消息队列.
因为 Application.OnMessage 只接收队列中的消息,
所以 Perform、SendMessage 发送的消息, OnMessage 收不到.


消息和消息参数:

消息就是一个整数, 就是微软给做的一个编号:
0 .. WM_USER-1: Windows 使用
WM_USER .. $7FFF: 窗体类使用
$8000 .. $BFFF: 保留
$C000 .. $FFFF: 应用程序使用
大于 $FFFF: 保留

Delphi 也自定义了一些消息, 分别是 CM_ 和 CN_ 打头.

posted @ 2011-09-28 15:07  ftwsnow  阅读(226)  评论(0编辑  收藏  举报