【问题标题】:Global low level keyboard hook - Race Condition全局低级键盘钩子 - 竞争条件
【发布时间】:2012-08-17 18:52:54
【问题描述】:

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

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

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


编辑

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

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

【问题讨论】:

  • 只是好奇,你为什么需要这个?
  • @HassanBoutougha:你为什么说间谍?我的帖子明确指出我正在防止击键。
  • @L.B:我编写了一个应用程序,它允许我的小儿子在键盘上打字而不会造成任何问题。除了他一直打开我的浏览器和计算器。
  • 你可能还会想到DeepFreeze这样的应用程序
  • @RomanR。这不适用于低级挂钩。其他全局钩子需要它,因为它们需要将 dll 注入目标进程。底层钩子在原始进程中运行。

标签: c# .net winapi keyboard-hook


【解决方案1】:

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

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

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

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

DebugProc 函数

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

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

【讨论】:

  • 谢谢。目标是打开一个快速应用程序,让他输入,保存文本(或通过电子邮件发送),然后关闭它 - 然后恢复正常。你的建议会花很长时间,我永远不会这样做。
  • 至于 WH_DEBUG 钩子 - 有一件事我不清楚。 To prevent the system from calling the hook... 是什么意思?它是否跳过所有钩子(并允许按下键)?还是取消击键,例如在WH_KEYBOARD_LL 钩子中?
  • 您实际上是调试器。如果您允许,您将在钩子之前收到通知,并且可以访问将传递给钩子的数据。
  • 我相信低级钩子不受调试钩子的影响。 “调试钩子无法跟踪这种类型的低级键盘钩子。”
【解决方案2】:

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

[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]

【讨论】:

  • 这行不通。我的应用程序没有安装。它是一个按需运行的单一可执行文件。我需要一些东西来强制我的应用程序只有在它运行时才成为钩子回调的第一个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
相关资源
最近更新 更多