如何拦截发送到我表单上任何 TWinControl 的消息?

How to intercept a message sent to any TWinControl on my form?

我面临着一项艰巨的任务,即每当 WM_GETOBJECT 消息发送到表单上的任何 TWinControl 时,我都必须拦截并处理它。

显然我不希望必须单独对每个控件进行子类化:

有没有办法参与使用 SendMessage

处理直接发送到子控件的每条消息

如果您不想子类化每个单独的控件(这当然是一个选项,并且可以使用插入器 类 进行简化),那么您可以改用 thread-specific WH_CALLWNDPROC or WH_CALLWNDPROCRET hook via the Win32 API SetWindowsHookEx() 函数。钩子会告诉你哪个 HWND 正在接收每条消息,当钩子与钩子在同一进程中时,你不需要在 DLL 中实现钩子。

如果您需要给定 HWNDTWinControl* 指针,您可以在 Vcl.Controls 单元中使用 VCL 的 FindControl() 函数。