使用 Qt 4.6 从键盘挂钩键和组合键

Posted

技术标签:

【中文标题】使用 Qt 4.6 从键盘挂钩键和组合键【英文标题】:Hook key & key combinations from keyboard with Qt 4.6 【发布时间】:2010-06-05 11:31:10 【问题描述】:

假设我有一个无窗口应用程序,它在任务栏上只有一个图标(Windows、Mac OS X 和 Linux)。我希望它能够捕获一些键和组合键,比如 Right Control + Right Shift。键入正确的组合后,它会做一些事情,比如截图。我可以做无窗口应用程序、任务栏上的图标和屏幕截图,但我不知道如何全局监控键盘的组合键。请多多指教。非常感谢任何帮助或提示!提前致谢!

【问题讨论】:

在我看来,您无法抓取或捕获密钥,因为您没有将焦点放在窗口上。 只是好奇。你在等待比我更彻底的答案吗? ;) Global shortcuts in a cross-platform application的可能重复 【参考方案1】:

系统范围的密钥抓取是一个棘手的主题,但系统范围的密钥挂钩更加棘手。每个 OS/GUI 都有自己的解决方案,至少对于抓取来说是这样。 Qt4 没有公开这样的特性,但是Qt eXTension library 用它的QxtGlobalShortcut 解决了这个问题。这是一个很好的包装:

XGrabKey()/XUngrabKey() 在 X11 中, RegisterHotKey()/UnregisterHotKey() 在 Windows 中, Mac OS X 中的RegisterEventHotKey()/UnregisterEventHotKey()。

因此,您可以获取其他应用程序无法获得的显式组合键,即特定的键和修饰符(XGrabKey() 允许更多)。此处不支持按键序列,即连续的按键组合。


键盘挂钩功能更强大,因为它允许查看输入事件(甚至过滤它们)。它不仅被键盘记录器使用,而且是这里的典型关联。

如果您使用 Windows,那么您可以阅读:

Hooks and DLLs Joseph M. Newcomer, Hooks。

在 X11 中要复杂得多。您可能至少要阅读两页:

X.Org Wiki - Development/Documentation/InputEventProcessing - 有一些背景, Exploiting X11 to monitor keystrokes - 了解困难。

有一个X Event Interception Extension,但它没有得到维护,最终被删除了。

希望它可以在没有 X11 基础架构的帮助下完成。在 Linux 2.6 内核中有一个“事件接口”,称为evdev,可以在这里利用。详细信息可以在logkeys Linux keylogger的源代码中找到。它也可以通过类似于 evdev 的效果来完成。查看我的 PoC 项目: kaos - 关键活动屏幕显示。

而且我没有 Mac,所以没有进一步的参考。 ;)

【讨论】:

+1 谢谢。我没有注意到你的回答。我在 Mac OS X 中使用 libqxt 没有成功。 正如我所说,我不是 Mac 用户,所以在这里我无法为您提供帮助。对不起。 有趣,Win32 Hooks 现在是带有Content Removed 的空白页面。是我的错吗? ;) 我会更新上面的答案。别担心,有一个Wayback Machine。 http://web.archive.org/web/20080510093117/http://msdn.microsoft.com/en-us/library/ms997537.aspx) - Kyle Marsh 的 Win32 Hooks

以上是关于使用 Qt 4.6 从键盘挂钩键和组合键的主要内容,如果未能解决你的问题,请参考以下文章

js组合键和单个键盘事件

js组合键和单个键盘事件

WPF中设置组合键时间

Qt键盘事件--组合键响应方法

从 Qt4 移植到 Qt5 时 Ctrl+U 组合键丢失

微软笔记本 Surface Pro 键盘失灵组合键重启的方法(原理不详)