C# 全局低级键盘挂钩-竞争条件

C# 全局低级键盘挂钩-竞争条件,c#,.net,winapi,keyboard-hook,C#,.net,Winapi,Keyboard Hook,我已经编写了一个c#应用程序,其中包含一个WinAPI低级键盘挂钩,我使用它来阻止除字母数字键以外的所有键 问题是——其他程序(登录时启动的程序)也有键盘挂钩(用于启动计算器、浏览器等应用程序)。在我的钩子回调到达之前,这些程序已经打开了这些应用程序,因此,我无法停止该操作 有没有办法确保我的钩子在别人之前被调用 编辑 为了消除混淆,我的应用程序是一个没有安装程序的可执行文件。它是按需运行的 我需要能够接管其他钩子-或者干脆强制首先调用我的钩子回调-即使其他人已经调用了SetWindowsHo

我已经编写了一个c#应用程序,其中包含一个WinAPI低级键盘挂钩,我使用它来阻止除字母数字键以外的所有键

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

有没有办法确保我的钩子在别人之前被调用


编辑

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


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

您不能使用安装程序编辑钩子回调吗

[HKEY\U CURRENT\U USER\Software\Microsoft\Windows\CurrentVersion\Run]

注册表值?我从来没有明确尝试过做你想做的事。。。我不确定您是否可以从安装程序中重新排序这些键值,但这应该足够早地捕获它

或其中一项: [HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] [HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce] [HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices] [HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
[HKEY\U LOCAL\U MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit]

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

去一家二手店,买一个便宜的USB键盘,然后切断你不想让你儿子使用的按键的连接,怎么样?然后,你可以将USB连接到现有键盘的USB端口,在你儿子玩的时候把键盘推开

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

否则,我认为您可能需要安装hook,以便在键盘消息传递到任何其他hook之前获取它

DebugProc函数

系统在调用钩子过程之前调用此函数 与任何类型的挂钩有关。系统传递有关的信息 要调用到DebugProc钩子过程的钩子,该钩子过程检查 信息,并确定是否允许调用挂钩


DebugProc将通过wParam中调用的钩子类型(在您的例子中是WH_KEYBOARD_LL)和lParam中包含实际WH_KEYBOARD_LL钩子信息的结构来传递给钩子链。

只是好奇,为什么需要这个?@HassanBoutougha:为什么说spy?我的帖子清楚地说明了我在防止击键。@L.B:我写了一个应用程序,允许我的小儿子在键盘上打字而不会引起任何问题。除非他一直打开我的浏览器和计算器。你可能还会想到像@RomanR这样的应用程序。这不适用于低级挂钩。其他全局钩子需要它,因为它们需要将dll注入目标进程。低级挂钩在原始流程中运行。这不起作用。我的应用程序没有安装。它是按需运行的单个可执行文件。我需要的东西,迫使我的应用程序是第一个在钩回调只有当它运行。谢谢。目标是快速启动一个应用程序,让他输入、保存文本(或通过电子邮件发送),然后关闭它——然后恢复正常。你的建议会花很长时间,我永远不会这么做。至于什么调试钩子-有一件事我不清楚。阻止系统调用钩子的
意味着什么?它是否跳过所有挂钩(并允许按键)?还是像在
WH\u KEYBOARD\u LL
hook中那样取消击键?实际上,您就是调试器。如果允许的话,您将在钩子出现之前收到通知,并可以访问将传递给钩子的数据。我相信低级钩子不会受到调试钩子的影响。“调试挂钩无法跟踪此类型的低级键盘挂钩。”