c# - 全局低级键盘 Hook - Race Condition

标签 c# .net winapi keyboard-hook

我编写了一个 C# 应用程序,其中包含一个 WinAPI 低级键盘钩子(Hook),我用它来防止除字母数字键之外的所有键。

问题是 - 其他程序(那些在登录时启动的程序)也有键盘钩子(Hook)(用于启动计算器、浏览器等应用程序)。在我的钩子(Hook)回调到达之前,这些程序已经打开了这些应用程序,因此,我无法停止该操作。

有什么方法可以确保我的钩子(Hook)先于其他钩子(Hook)被调用吗?


编辑

消除混淆 - 我的应用程序是一个没有安装程序的可执行文件。它按需运行。

我需要能够接管其他 Hook - 或者只是强制首先调用我的 Hook 回调 - 即使其他人已经调用了 SetWindowsHookEx 方法。

最佳答案

虽然它没有回答如何以编程方式做到这一点,但如果我们从不同的角度来看它,可能会有一个可以接受的解决方案来解决您的特定问题......

去二手店买一个便宜的 USB 键盘,然后切断与您不想让儿子使用的键的连接怎么样?然后,您可以将 USB 连接到现有键盘的 USB 端口,并在您儿子演奏时将键盘推开。

当他完成后,断开您儿子的键盘并将您的键盘移回原位。

否则,我认为您可能需要安装 WH_DEBUG钩子(Hook)在键盘消息传递给任何其他钩子(Hook)之前获取键盘消息。

DebugProc function

The system calls this function before calling the hook procedures associated with any type of hook. The system passes information about the hook to be called to the DebugProc hook procedure, which examines the information and determines whether to allow the hook to be called.

DebugProc 将通过 wParam 中调用的 Hook 类型(在您的情况下为 WH_KEYBOARD_LL)和 DEBUGHOOKINFO 传递给 DebugProc。 lParam 中的结构,其中包含将传递到 Hook 链的实际 WH_KEYBOARD_LL Hook 信息。

关于c# - 全局低级键盘 Hook - Race Condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12011579/

相关文章:

.net - 使用 C# 动态编译代码

windows - Win32 : How to custom draw an Edit control?

winapi - InitializeCriticalSectionAndSpinCount,是否有默认的旋转计数?

delphi - 如何对特定 HID 设备执行硬件重置?

c# - 如何反序列化使用 ContractResolver ResolvePropertyName 编写的属性

.net - 在 Microsoft CRM 4.0 中使用 Web 服务与使用动态实体

c# - 压缩/加密的最佳实践

c# - 左/右连接与查询中的多个连接

c# - 表达式引用了一个不属于模拟对象的方法

c# - 如何使用 ref struct 参数和未知返回类型调用内部方法