问题标签 [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 投票
1 回答
237 浏览

c# - Powershell / C# keyhook 脚本 NullReferenceException 外部

我正在尝试使用 powershell 脚本(使用 C#)来收听击键。它在出错之前工作了很短的时间。有趣的是,在我添加了一些控制台写入之后,似乎错误发生在我的代码外部。

这是 powreshell 脚本:

错误是:

发生了未正确处理的错误。附加信息如下所示。Windows PowerShell 进程将退出。未处理的异常:System.NullReferenceException:对象引用未设置为对象的实例。

注意方法Console.WriteLine中的 ' HookCallback。但是最后打印的调试行是3,表明错误发生在HookCallback. 更有趣的是,如果我有多个脚本实例正在运行,它们不会同时出错;一个可能会崩溃,但其余的会继续运行一段时间。

我对 powershell 或 C# 不太熟悉,所以想知道如何获取更多调试信息?我希望出现错误的行号或文件或库名称,但不确定如何获取该信息。

免责声明,我从这里获取脚本https://blogs.msdn.microsoft.com/toub/2006/05/03/low-level-keyboard-hook-in-c/(稍作修改)。

编辑:我接受了 Stuartd 的回答,因为它很有帮助,但正如我在评论中所说,它需要进行一些小的修改才能工作。为了方便未来的读者,以下是有效的修改:

我在 C# 上进行了更多的搜索和阅读,似乎原因是它SetWindowsHookEx没有管理/保持活动它的 hookProc 委托参数,并且直接传递一个静态方法会创建一个本地(方法的本地)委托,准备好SetHook方法返回后删除。

0 投票
1 回答
299 浏览

c# - KeyHook 用于检测同时按下的多个键

嗨,我创建了一个程序来监控键盘,如果按下 CTRL+Shift+R,程序必须开始记录键并将它们写入文本文件。

我的第二部分(监控键和写入文本文件)工作得很好,不幸的是我的系统无法检测到是否同时按下了 ctrl+Shift+R。我将展示我正在使用的课程以及问题代码

我的班级我正在使用钥匙钩

我的问题代码没有被检测到

我正在使用的其他一些代码,但可以 100% 工作

我已经测试了钩子,如果我只检查是否按下了一个键,它就可以正常工作,但如果我想检查是否按下了多个键,它就不起作用。

0 投票
1 回答
499 浏览

.net - 无法使用 (SendKeys.Send) 粘贴字符串

我正在尝试创建一个允许我运行事件的应用程序,即使该应用程序不在焦点上。当我使用 [ctrl + alt + V] 触发事件时,它会在数组中选择一个随机字符串并将其粘贴到当前选定的输入框中(这可能是在 Firefox、记事本、游戏中......)。但是,应用程序不会粘贴剪贴板中的信息。我正在使用SendKeys.Send("^v")复制 [ctrl + V]。

任何改进代码或解决问题的建议将不胜感激。

更新:我都试过了:它们SendKeys.Send("^(v)")SendKeys.Send("^v")不会触发粘贴命令。我试图SendKeys.Send("{ENTER}")查看是否有任何 SendKeys 有效,它确实有效。使用SendKeys.Send("{ENTER}")应用程序触发了回车键。

0 投票
0 回答
92 浏览

qt - Qt:当我的应用程序在 Qt5 中没有焦点时如何接收键盘事件?

我有与这篇文章完全相同的问题:我想制作一个软件,一旦执行,它将监视特定的键事件(按 F12)并会做一些事情(重复鼠标点击:自动点击器)。但如果可能的话,我希望自己使用 Qt 来完成这个技巧,而不是调用 Windows 的函数(特别是因为它最终很可能会在 Linux 中使用,所以需要一个跨平台的解决方案)

正如上面的链接所示,我的问题并不是什么新鲜事,包括 Qt 用户。此外,这篇文章中已经发布了一个不错的答案,但它涉及Qt eXTension在 Qt 4 上下文中的使用,而且已经过时了。事实上,它已经过时了,以至于当我尝试访问 eXTension 链接时,我的 Chrome 浏览器警告我这是一个不安全的网站!所以我特别想知道的是是否有任何 Qt 5,特别是这个问题的解决方案,因为 eXTension 是不可能的,或者我是否必须做一个操作系统密钥挂钩。Qt5 免费库也是可以接受的。

0 投票
1 回答
64 浏览

c - 如何同时运行一个钩子和一个计时器?

我正在尝试用 C 编写一个宏程序,并且我已经设法使用以下代码获取密钥:

我希望程序在按下特定键时在特定时间按下一系列键并具有SendInput()功能。当WH_KEYBOARD_LLwhile 循环设置为无限时,不再调用钩子。对我来说,使用GetMessage(&msg, NULL, 0, 0)似乎也不干净。

我已经搜索了一个钩子方法来在给定的时间间隔内调用一个函数,但没有成功。

我使用 GNU GCC 编译器。

我几乎没有在计算机上用 C 语言编程的经验,但我确实有用 C 语言为微控制器编程的经验。

编辑:

我已经尝试过使用 SetTimer() 的方法,但它没有被调用。我使用了此页面中的示例:http: //www.equestionanswers.com/vcpp/set-timer.php

0 投票
1 回答
269 浏览

c# - 如何在 C# 中停止进一步处理全局热键

我正在尝试创建一个将对全局热键做出反应的 C# 应用程序;ALT+H然后当我释放ALT钥匙时。这实际上工作得很好,但我的问题是,当我的应用程序完成了它应该使用热键做的任何事情时,它应该阻止这个热键被其他应用程序处理。我从这个 StackOverflow 帖子中获得了大部分代码,C# 应用程序中的全局键盘捕获,但我在其他地方看到了return (IntPtr)1;应该能够停止进一步处理密钥的地方。

但是...当我在例如 Word 或 Wordpad 中并按下时ALT+H,Word 会显示所有类型的菜单 - 我不想要它,因为我只想让我的应用程序做某事:-)

对于这个相当长的代码,我很抱歉,但我认为它很重要,因此您可以获得完整的概述。我用的地方只有 1 个return (IntPtr)1;

我的代码:

我不是一个可靠的 C# 开发人员,因为我在这里开始了我的前几个婴儿步骤 - 那么为什么我会把自己作为第一件事之一投入到全球热键的深水中 ;-) 有没有人可以在这里给出一些提示可能在某个地方有一个愚蠢的错误?

0 投票
1 回答
85 浏览

java - Java /将键从键盘或鼠标转换为另一个键

我有一个 Swing Java 应用程序(A ),它 在按下某个按钮时启动另一个应用程序(B) 。Runtime.getRuntime().exec()

是否可以设置某个 Key Hook 以便当应用程序(B)打开并处于活动状态时,它会更改按钮(例如,当您按下“Q”时,实际上按下了“H”按钮,等等上)。和鼠标类似的情况(例如,如果“ Mouse Mid ”或“ Mouse Wheel ”被按下,实际上另一个按钮被按下,例如“ T ”)。

理想情况下,如果可能,它应该适用于所有操作系统,但主要适用于 Windows。

请告诉我是否有可能实现这一点,我很乐意提供任何建议或示例。

0 投票
1 回答
70 浏览

c++ - 每当顶部窗口更改时,Win32 键盘挂钩回调接收 VK_LCTRL 事件

我在带有 Visual Studio 2019 的 Windows7 上使用 Windows API。

我正在尝试设置一个低级键盘挂钩并读取控制台的键输入,为此我使用函数:HHOOK SetWindowsHookExA( [in] int idHook, [in] HOOKPROC lpfn, [in] HINSTANCE hmod, [in] DWORD dwThreadId ) 和参数:WH_KEYBOARD_LL所以我可以监视键盘事件。

这是我的主要功能:

这是回调实现:

这两个变量如何工作不是这里的问题,而只是知道在回调中keyHandler翻译消息并将fileHandler结果打印到文件中。

问题来了。回调接收:

  • 当我按下一个键时的按键事件

  • 我释放时的按键事件

  • 当我按住按键时重复按键事件

  • VK_LCONTROL焦点窗口更改时的控制键向上事件

为什么会这样?据我所知,MSDN 文档中从未提及此行为。如果我从控制台窗口或任何窗口切换到任何其他窗口,则会生成此事件[left control up]并由我的keyHandler!

现在为了确保我的代码没有问题,我将回调更改为:

并且每当我更改焦点窗口时仍然CTRL会打印到控制台,请注意仅VK_LCONTROL生成并且 wParam 始终WM_KEYUP

这不应该发生!

我尝试分析和修改我的代码,尝试从主函数中删除所有内容,直到它看起来就像上面的示例一样,甚至重新启动计算机以检查它是否是内部问题,没有任何帮助。当在网上搜索具有类似问题的类似帖子时,我发现完全没有,这使得它更加混乱。

更新

我尝试从 GitHub 编译别人的键盘挂钩相关代码,同样的问题.. 这正常吗?为什么没有记录?

0 投票
0 回答
24 浏览

vb.net - 如何在无限循环上运行后台工作者

我正在为应用程序开发一个插件。我需要实现一个低级的 keyhook 来捕获键。我曾尝试在与主应用程序 + 插件相同的线程上运行 keyhook,但它的性能是命中注定的。我无法与应用程序的原始开发人员进行查询。

因此,我实现了下面的代码来在后台工作人员上运行 keyhook。它工作可靠,但我非常清楚Application.DoEvents我知道这很糟糕。编码:

我确定我的架构很糟糕,但我有点坚持让它在开发环境中工作。我尝试在后台线程中使用计时器,但无法使其正常工作。我也在.net Framework 3.5(原始应用程序的框架)中开发,因此我认为这限制了我可以用线程做的事情。我研究了线程,我正在努力理解如何无限运行它们并与主线程进行通信。

因此,基本上,我需要在主应用程序 + 插件的生命周期内在单独的线程上运行 keyhook,并将任何 keydown 和 keyup 事件反馈到主线程中。有任何想法吗?

0 投票
0 回答
41 浏览

c# - C# 全局挂钩键盘,Winform - .NET 6.0

我有一个关于过去几个小时内我无法解决的问题的问题。所以基本上我想在 .NET 6 中制作一个 C# WinForm 应用程序,我需要该应用程序响应按下的 ctrl 键(它会模拟单击某个按钮会做什么),但有一个问题。我需要该应用程序在最小化时感知按下的键。当应用程序处于正常状态时,它正在工作,但在最小化时不会。这里的许多其他答案都很旧,所以我想自己做,因为没有一个解决方案适合我,而且代码非常复杂。感谢您的任何回复。