问题标签 [keyhook]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2295 浏览

c# - 低级键钩

我想在 C# 中的单独线程上运行低级 keyhook 以检测某些热键。我该怎么做?

0 投票
2 回答
4817 浏览

c# - 如何在 C# 中设置系统范围的 HotKey

AutoIt v3 中有一个名为HotKeySet的函数。它设置了一个热键,在按下时调用用户函数。这是一个系统范围的热键,这意味着当设置热键时,该键不能用于其他任何操作。

基本上,我想抓住Esc或任何其他键,如$,`等,当用户在任何地方按下它时,甚至在应用程序之外,它应该让我知道。

例如,我希望在循环中使用 HotKeySet({ESC}),当它完成时,程序会等待之前按下该键。

0 投票
1 回答
810 浏览

c# - C# keyhook 问题

我从http://www.codeproject.com/KB/cs/CSLLKeyboardHook.aspx复制了以下代码,

它工作正常,但当我做一点改变时:

在返回 CallNextHookEx(...) 之前,原来的键仍然出现在记事本中。前任。如果我按“a”,我希望记事本中的字母是“b”,但它仍然是“a”。似乎“lParam”没有改变。无法理解为什么?

0 投票
2 回答
7135 浏览

vb.net - VB.net 捕获 Ctrl+C

我想在有人使用时捕捉,CtrlC即使是在失焦的情况下。我正在使用 Visual Basic 2010。

0 投票
2 回答
1922 浏览

c# - 使用 Windows 消息按住 Alt 按钮

如何使用 Windows 消息按住 ALT 按钮?

是否有 WM_KEYHOLD 或类似的东西?

这是屏幕截图的代码,但我想有些东西是丢失的。我认为我使用的键码不好,对于 0x70 它发送 F1。对于 0x46,它会发送令人讨厌的窗口声音。

0 投票
1 回答
1399 浏览

java - 使用 jna 进行 keyhook 和消费

我正在制作一个自动点击器,它使用 jna 来挂钩来自键盘和鼠标的全局输入。对于使用http://code.google.com/p/goldriver/source/browse/trunk/king/src/jnacontrib/w32keyhook/KeyHook.java?r=36的键盘挂钩。

我想知道是否有任何可能的方式来消费关键事件,以便其他应用程序不处理它?

通过返回新的 LRESULT (1) 修复;

现在我遇到了一个问题,它不能继续使用其余的代码,这里是源代码。我的程序一直在监听键盘输入,甚至不继续显示 GUI。

0 投票
2 回答
1863 浏览

c++ - 为什么我的低级 Windows 键挂钩停止工作?

这是我最初的问题的延续, 为什么在我的 DX11 游戏期间加载了 D3D10SDKLayers.dll?我正在创建一个 DX11 游戏,并使用低级别的 windows 键挂钩来捕获 Alt+Enter,以便我可以使用自己的方法切换全屏,而不是让 Windows 自动执行,这不可避免地会导致问题。链接问题中提供了此过程和详细信息的描述。我的问题是,由于某种原因,在第 6 次 Alt+Enter 之后,关键挂钩始终停止工作。我自己并没有取消注册。

这是关键的钩子代码:

如果您需要更多信息,请告诉我需要什么。我不知道为什么会这样,所以我不确定我需要提供什么样的信息。据我所知,除了显式取消注册之外,摆脱密钥挂钩的唯一方法是如果 Windows 超时。所有 MyClassVar 方法都是内联的,以尽可能快,并且 Alt+Enter 是从单独的线程处理的。

0 投票
2 回答
131 浏览

programming-languages - 编写热键实用程序

我有一个项目,我需要在其中使用热键,它可以在整个 Windows 操作系统中全局工作。现在,据我所知,我只知道如何阅读当前表单上的关键事件。我将如何编写热键实用程序?什么是最好的语言呢?

谢谢

0 投票
0 回答
446 浏览

c# - 带有 UI 的全局键/鼠标钩子

我想在屏幕上制作一个带有键盘和鼠标的 C# 应用程序。
每个被点击的键或按钮都应该在这个应用程序中看到,例如为其中一个键着色(我知道怎么做)。如果应用程序没有聚焦,这也应该有效。
目前我正在使用一个工作正常的全局键和鼠标钩。
问题是,Keyhook 一次只能拦截一个 Key,这意味着我一次只能在 Key 上显示。我希望能够在屏幕上一次显示多个键。不幸的是,KeyListeners 是没有选择的,因为它们不能在应用程序之外工作。有谁知道如何使这成为可能?

这是我正在使用的 KeyHook:

0 投票
2 回答
4831 浏览

c++ - 64 位 Windows 上的全局 Keyhook

我目前无法在 Windows 7 64 位操作系统上使用全局键挂钩。现在我知道 Stackoverflow 上已经有很多关于这个主题的主题了,但是没有一个能给我一个我可以使用的答案,或者我不太明白这些主题是如何解决这个问题的。

因此,我将尝试解释我正在努力解决的问题,并希望任何人都可以帮助我或为我指明正确的方向。

基本上,我的目标是拦截 CTRL+C 和 CTRL+V 键盘输入,以实现一种剪贴板管理器。出于这个原因,我目前的尝试是注册一个系统范围的WH_KEYBOARD钩子,它可以根据我的需要处理截获的击键。

我在 64 位 Windows 7 O/S 上运行挂钩,这就是问题开始的地方。对我来说很明显 32 位 Hook DLL 会导致 64 位进程出现问题,反之亦然。出于这个原因,我生成了包含钩子的库的 x86 和 x64 版本,以及钩子的调用者(调用者SetWindowsHookEx()),两者都具有不同的文件名,如文档所示。

但是现在呢?如果我将我的 64 位 DLL 设置为系统范围的钩子,则所有 32 位应用程序只要我在聚焦时按下一个键就会开始挂起。当我应用 32 位挂钩时,我的 Windows 实际上无法使用,因为它explorer.exe是 64 位的。如果我设置了两个钩子,我的系统就会陷入停顿状态,从而引发一场全球性的“比特”斗争。

现在我假设问题出在例如试图注入 32 位进程的 64 位挂钩 DLL 等等,这当然是毫无意义的。但是对于这种情况,文档SetWindowsHookEx()说明如下:

因为钩子在应用程序的上下文中运行,所以它们必须与应用程序的“位数”相匹配。如果 32 位应用程序在 64 位 Windows 上安装全局挂钩,则 32 位挂钩将被注入每个 32 位进程(通常的安全边界适用)。在 64 位进程中,线程仍被标记为“已挂钩”。但是,由于 32 位应用程序必须运行钩子代码,系统会在钩子应用程序的上下文中执行钩子;具体来说,在调用 SetWindowsHookEx 的线程上。这意味着挂钩应用程序必须继续发送消息,否则可能会阻止 64 位进程的正常运行。

我不完全理解文本的粗体部分,但我将其解释为如果钩子目标的“位数”与钩子不同,它将在实际设置钩子的线程上执行所以它完全可以执行。此外,这意味着该线程必须仍然处于活动状态并且可能正在运行某种消息循环。它是否正确?还是我完全不喜欢这个?该文档似乎还提供了有关如何处理我的场景的确切说明:

要在 64 位 Windows 安装的桌面上钩住所有应用程序,请安装一个 32 位全局钩子和一个 64 位全局钩子,每个钩子都来自相应的进程,并确保在钩子应用程序中保持泵送消息,以避免阻塞正常运作。

但是我无法掌握在我的实施中必须做的事情。为了最终展示一些代码,让我们以这个尝试设置系统范围的 keyhook 的基本示例为例。我猜线程的创建代码应该是无关紧要的:

钩子本身保持相当简单 - 在跨越位数时足以引起挂断问题:

我想有些人现在可能会把手举过头顶,你可以看出我很少使用钩子;)

但这正是我要问的原因:)

简而言之:如果有人能告诉我如何更改上述示例以使系统范围的 keyhook 在 64 位 Windows 上工作,我将不胜感激。我的问题是某些具有除钩子之外的其他“位数”的应用程序开始挂起,我不知道如何解决这个问题。

很感谢任何形式的帮助!

谢谢并恭祝安康

葡萄干