当前位置: 源码素材网 » Delphi教程 » 详情页

Delphi 中消息的发送与接收相关函数讲解及示例代码

  •   时间:2020-02-19
  • 概述:消息发送 消息接收

消息的发送:

在Windows操作系统中通常使用的消息类型有标准消息、组件通知消息和用户自定义消息。标准消息是Windows系统经常发生的一些标准活动,Windows系统的标准消息过程是最简单的消息处理过程,而且这些标准消息的消息处理过程都必须以WM_开头。组件通知消息是指子组件传递给父窗口或父类组件的消息。该类消息主要用于子类组件产生某一事件、子类组件向父类组件发送产生何种事件的消息通知、父类组件收到消息通知后再决定如何处理此消息。组件通知消息一般会以组件的首字母为前缀来命名。例如:按钮类的通知消息以BN_开头,编辑类组件的通知消息以EN_开头,列表类的通知消息以CN_开头。自定义消息用于在程序中向自己或其他程序发送消息。在Windows系统中WM_USER消息的取值被定义为$0400,WM_APP消息的取值被定义为$8000。值描述:

0 — WM_USER - 1 系统使用的消息
WM_USER — $7FFF 自定义消息
WM_APP — $BFFF 应用程序使用的消息
$C000 — $FFFF 应用程序使用的字符串消息

(1)SendMessage函数:该函数用来向窗口发送信息。利用该函数发送消息到指定的窗口队列,但不会立即返回,而是等发送出去的消息被处理后才返回。声明:

function SendMessage(hWnd:HWND;Msg:UNIT;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
hWnd:接收消息的窗口句柄;
Msg:消息标识符;
wParam,lParam:消息的32位附加信息。

(2)PostMessage函数:该函数用于向窗口发送信息,并到指定的窗口队列,然后立即返回。其返回的是一个布尔值,表示消息是否发送到指定的消息队列中。声明:

function PostMessage(hWnd:HWND;Msg:UNIT;wParam:WPARAM;lParam:LPARAM):Boolean;
hWnd:接收消息的窗口句柄;
Msg:消息标识符;
wParam,lParam:消息的32位附加信息。

(3)PostThreadMessage函数:该函数用于向线程中发送消息,并到指定的线程中,然后立即返回。该函数返回的是一布尔值,表示消息是否发送到指定的线程消息队列中。声明:

function PostThreadMessage(hWnd:HWND;Msg:UNIT;wParam:WPARAM;lParam:LPARAM):Boolean;

(4)Perform方法:该方法声明在TControl类中,适用于所有的TControl派生的对象,并可以向任何一个窗体或组件发送消息。声明:

function Perform(Msg:Cardinal;wParam,lParam:Longint):Longint;

(5)Broadcast方法:该方法声明在TWinControl类中,用于向当前组件的所有子组件广播一条消息。声明:

procedure Broadcast(var Message);

消息的接收:

对应程序员来说消息的接收就是消息的截获。在Delphi中对于消息的截获主要可以通过以下几种方式来完成:

(1)消息钩子:对于钩子来说可以针对所有的窗体句柄来截获消息。使用性广泛,针对的不仅仅是一个窗口,而是进程所在的所有窗体的消息。可以使用SetWindowsHookEx(WH_CALLWNDPROC,@HookProc,0,GetCurrentThreadId);挂接消息钩子,当然也可以根据需要设置其他类型的钩子。然后在HookProc过程中来处理消息。代码如下:

function HookProc(nCode:UNIT;wPar,lPar:LongInt):LongInt;stdcall;
begin
//消息处理代码
end;

(2)子类化(SubClass):简单地说,就是替换窗口过程。该过程使用SetWindowLong(AHandle,GWL_WNDPROC,Integer(@NewWndProc))。

(3)重载(Override)窗口处理函数WndProc/DefaultHandler,重载父类的窗口处理过程WndProc,然后在里面处理需要的消息,代码如下:

TMyControl = class(TControl)
protected
procedure WndProc(var AMsg: TMessage); message WM_PAINT;
end;
procedure TForm1.WndProc(var AMsg: TMessage);
begin
//消息处理代码
end;

(4)消息句柄(Message Handler):截获特定消息,自定义消息,代码如下:

TForm1 = class(TForm)
....
private
procedure WMPaint(var AMsg: TMessage); message WM_PAINT;
...
end;
procedure TForm1.WMPaint(var AMsg: TMessage); 
begin
//消息处理代码
end;

    相关声明:

      若“Delphi 中消息的发送与接收相关函数讲解及示例代码”有损您的权益,请告之我们删除内容。
      部分文章来源于网络,版权归原作者所有。