3

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

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

有什么方法可以确保我的钩子在任何其他人之前被调用?


编辑

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

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

4

2 回答 2

1

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

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

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

否则,我认为您可能需要安装WH_DEBUG钩子以获取键盘消息,然后再将其传递给任何其他钩子。

DebugProc 函数

系统在调用与任何类型的钩子相关的钩子过程之前调用这个函数。系统将有关要调用的钩子的信息传递给 DebugProc 钩子过程,后者检查信息并确定是否允许调用钩子。

DebugProc 将传递 wParam 中调用的钩子类型(在您的情况下为 WH_KEYBOARD_LL),以及 lParam 中的DEBUGHOOKINFO结构,其中包含将传递给钩子链的实际 WH_KEYBOARD_LL 钩子信息。

于 2012-08-17T21:43:03.037 回答
0

你不能用你的安装程序来编辑

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

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

或其中之一:[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices] [HKEY_LOCAL_MACHINE\Software\Microsoft \Windows\CurrentVersion\RunServicesOnce] [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit]

于 2012-08-17T19:07:46.883 回答