0

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

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

(如何才能做到这一点?

4

1 回答 1

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在消息发送到控件之前触发,这听起来对您来说可能是错误的方式。

于 2013-09-26T13:59:20.607 回答