我正在使用一个内部具有 KeyDown 处理程序的组件,该处理程序发送用户定义的 PostMessage(WM_GROUPUNGROUP),并且还有一个自定义消息处理程序来处理 WM_GROUPUNGROUP。
我希望我的应用程序在执行此消息处理程序后执行某些操作,而无需修改组件代码。
(如何才能做到这一点?
我正在使用一个内部具有 KeyDown 处理程序的组件,该处理程序发送用户定义的 PostMessage(WM_GROUPUNGROUP),并且还有一个自定义消息处理程序来处理 WM_GROUPUNGROUP。
我希望我的应用程序在执行此消息处理程序后执行某些操作,而无需修改组件代码。
(如何才能做到这一点?
实现此目的的一种方法是通过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
在消息发送到控件之前触发,这听起来对您来说可能是错误的方式。