如何拦截用户定义的消息两次?

时间:2013-09-26 13:51:59

标签: delphi postmessage

我正在使用一个内部有KeyDown处理程序的组件,该处理程序发送用户定义的PostMessage(WM_GROUPUNGROUP),并且还有一个自定义消息处理程序来处理WM_GROUPUNGROUP。

我希望我的应用程序在执行此消息处理程序后执行某些操作,而不修改组件代码。

(怎么样)可以这样做吗?

1 个答案:

答案 0 :(得分:4)

实现此目的的一种方法是通过WindowProc属性。

只需在要挂钩的实例上分配WindowProc,即可提供自己的窗口过程。您需要将副本复制到WindowProc的上一个值,以便确保执行原始处理。

大概就是这样:

type
  TMyClass = class
  ....
    FOldWindowProc: TWndMethod;
    procedure NewWindowProc(var Message: TMessage);
  ....
  end;

要重定向窗口过程,请执行以下操作:

FOldWindowProc := SomeControl.WindowProc;
SomeControl.WindowProc := NewWindowProc;

然后实现这样的新窗口过程:

procedure TMyClass.NewWindowProc(var Message: TMessage);
begin
  FOldWindowProc(Message);
  if Message.Msg = WM_GROUPUNGROUP then 
    ....
end;

完成控件后,将旧窗口过程放回原位:

SomeControl.WindowProc := FOldWindowProc;

另一种方法是利用消息排队的事实。您可以添加Application.OnMessage处理程序,最有可能是使用TApplicationEvents对象。这将查看所有排队的消息。但是,OnMessage会在将消息发送到控件之前触发,这听起来可能是错误的方式。