2012-08-17 61 views
3

我写了一个c#应用程序,其中包含一个WinAPI低级别键盘钩子,用于防止除字母数字键以外的所有其他键。全局低级别键盘钩子 - 竞争条件

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

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


编辑

要清理混乱 - 我的应用程序是没有安装的可执行文件。它按需运行。

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

+2

只是好奇心,你为什么需要这个? – 2012-08-17 18:56:23

+0

@HassanBoutougha:你为什么说间谍?我的帖子明确指出我正在阻止击键。 – 2012-08-17 19:32:13

+1

@ L.B:我写了一个应用程序,允许我的宝贝儿子在键盘上输入而不会造成任何问题。除了他不断打开我的浏览器和计算器。 – 2012-08-17 19:33:13

回答

0

无法您使用的安装程序来编辑

[HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \ Run中]

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

或者其中一种: [HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ Run中] [HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \的RunOnce] [HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \ RunServices] [HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ RunServicesOnce] [HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ Userinit]

+0

这不会工作。我的应用程序未安装。它是按需运行的单个可执行文件。我需要一些强制我的应用程序在其运行时仅在钩子回调中处于第一位的东西。 – 2012-08-17 19:37:19

1

尽管它没有回答如何如果我们从另一个角度来看,可能会有一个可接受的解决方案来解决您的具体问题...

如何去二手商店,购买便宜的USB键盘,以及然后剪下你不想让儿子使用的钥匙的连接?然后,您可以将USB连接到现有键盘的USB端口,并在您的儿子玩游戏时将键盘推开。

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

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

DebugProc功能

系统调用与任何类型的钩子相关联的钩子程序 之前调用此函数。系统将要调用的钩子的信息传递给DebugProc钩子程序,该钩子程序检查信息并确定是否允许钩子被调用。

的DebugProc将获得通过钩子被称为wParam中(你的情况WH_KEYBOARD_LL)的类型,以及DEBUGHOOKINFO结构,lParam中包含将被传递给钩子链中的实际WH_KEYBOARD_LL钩信息。

+0

谢谢。目标是拉起一个快速的应用程序,让他键入,保存文本(或发送电子邮件),并关闭它 - 然后恢复正常。你的建议需要很长时间,我永远不会这样做。 – 2012-08-17 22:22:43

+0

至于WH_DEBUG挂钩 - 有一件事我不清楚。 “为了防止系统调用钩子......”是什么意思?它是否跳过所有钩子(并允许按下该键)?还是取消了按键,就像在WH_KEYBOARD_LL钩子中一样? – 2012-08-17 22:24:05

+0

实际上,您是调试器。如果您允许,您将在挂钩之前收到通知,并可以访问将传递给挂钩的数据。 – GalacticJello 2012-08-21 12:50:00