我有一个包含 .NET 和 Delphi 组件的应用程序,我在两个组件中都注册到键盘挂钩(使用 SetWindowsHookEx)。我首先在 .NET 中注册,然后在 Delphi 中注册。
问题是,Delphi 中的钩子委托在 .NET 中的钩子委托之前被调用。
根据MSDN,挂钩链只是一个列表,据我了解,应根据注册顺序调用代表。
任何人都知道这里发生了什么?提前致谢!
我有一个包含 .NET 和 Delphi 组件的应用程序,我在两个组件中都注册到键盘挂钩(使用 SetWindowsHookEx)。我首先在 .NET 中注册,然后在 Delphi 中注册。
问题是,Delphi 中的钩子委托在 .NET 中的钩子委托之前被调用。
根据MSDN,挂钩链只是一个列表,据我了解,应根据注册顺序调用代表。
任何人都知道这里发生了什么?提前致谢!
你误会了。MSDN 中的钩子概述是这样描述的(添加了重点):
SetWindowsHookEx函数总是在钩子链的开头安装一个钩子过程。当某个特定类型的钩子监视的事件发生时,系统会在与该钩子关联的钩子链的开头调用该过程。链中的每个钩子过程确定是否将事件传递给下一个过程。挂钩过程通过调用CallNextHookEx函数将事件传递给下一个过程。
因此,如果您的 Delphi 挂钩最后安装并首先被调用,这正是预期的行为。根本没有什么“正在发生”。
钩子列表不是列表,而是链。新安装的钩子保留了对前一个钩子的引用。这意味着稍后安装的钩子总是在之前安装的钩子之前执行。