想要在使用 SetWindowsHookEx 读取后停止数据进入操作系统/应用程序

Posted

技术标签:

【中文标题】想要在使用 SetWindowsHookEx 读取后停止数据进入操作系统/应用程序【英文标题】:Want to stop the data going into OS/application after read using SetWindowsHookEx 【发布时间】:2011-10-03 14:34:36 【问题描述】:

我正在开发一个从操作系统读取击键的简单应用程序。我使用 API "SetWindowsHookEx" 来读取击键数据。

目前,数据被钩子读取并发送到操作系统或应用程序。

我想阻止这些数据进入操作系统或其他应用程序。使用“SetWindowsHookEx”读取数据后,有什么方法可以阻止数据进入 Windows 7 操作系统?

【问题讨论】:

【参考方案1】:

一般来说,为了防止任何消息被发送到它的目标,不要从钩子回调函数中调用 CallNextHookEx。默认情况下,hook 回调调用 CallNextHookEx。

请谨慎使用此功能,并仅停止某些特定消息。例如,有时调用此函数来禁用某些标准键,如 Alt+F4、Alt+Tab 等。

【讨论】:

【参考方案2】:

如果您使用的是“普通”键盘挂钩,您将在 https://msdn.microsoft.com/en-us/ms644984.aspx 上找到答案:

如果代码小于零,钩子过程必须返回值 由 CallNextHookEx 返回。

如果代码大于或等于零,并且钩子程序执行了 不处理消息,强烈建议您致电 CallNextHookEx 并返回它返回的值;否则,其他 已安装 WH_KEYBOARD 挂钩的应用程序将不会收到 挂钩通知,因此可能会导致行为不正确。如果钩 程序处理了消息,它可能会返回一个非零值 防止系统将消息传递给钩子的其余部分 链或目标窗口过程。

如果你使用的是低级键盘钩子,它写在https://msdn.microsoft.com/en-us/ms644985.aspx:

如果 nCode 小于零,钩子过程必须返回值 由 CallNextHookEx 返回。

如果 nCode 大于或等于 0,并且钩子程序执行了 不处理消息,强烈建议您致电 CallNextHookEx 并返回它返回的值;否则,其他 已安装 WH_KEYBOARD_LL 挂钩的应用程序将不会收到 挂钩通知,因此可能会导致行为不正确。如果钩 程序处理了消息,它可能会返回一个非零值 防止系统将消息传递给钩子的其余部分 链或目标窗口过程。

总结:

如果你想拦截一​​条消息 - 千万不要调用 CallNextHookEx 并返回一个非零值以防止它被传递到链中。

【讨论】:

以上是关于想要在使用 SetWindowsHookEx 读取后停止数据进入操作系统/应用程序的主要内容,如果未能解决你的问题,请参考以下文章

SetWindowsHookEx - 防病毒问题

窗户挂钩问题

无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc

在我的线程上下文中调用“SetWindowsHookEx”函数

增加 Windows 7 中的 SetWindowsHookEx 限制

用于 DeviceIOControl 的 SetWindowsHookEx,要使用啥 hookid?