我正在使用一个内部有KeyDown处理程序的组件,该处理程序发送用户定义的PostMessage(WM_GROUPUNGROUP),并且还有一个自定义消息处理程序来处理WM_GROUPUNGROUP。
我希望我的应用程序在执行此消息处理程序后执行某些操作,而不修改组件代码。
(怎么样)可以这样做吗?
答案 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
会在将消息发送到控件之前触发,这听起来可能是错误的方式。