假设我有一个无窗口应用程序,它的任务栏上只有一个图标(Windows、Mac OS X 和 Linux)。我希望它捕获一些键和组合键,比如右 Control + 右 Shift。输入正确的组合后,它会执行一些操作,例如截屏。我可以执行无窗口应用程序、任务栏上的图标和屏幕捕获,但我不知道如何全局监视键盘的组合键。请各位指教。非常感谢任何帮助或提示!提前致谢!
最佳答案
系统范围的 key 抓取是一个棘手的主题,但系统范围的 key Hook 甚至更棘手。每个操作系统/GUI 都有自己的解决方案,至少可供抓取。 Qt4 没有公开这样的功能,但是Qt eXTension library解决了它的问题 QxtGlobalShortcut 。这是一个很好的包装:
- XGrabKey()/XUngrabKey()在X11中,
- RegisterHotKey()/UnregisterHotKey()在 Windows 中,
- Mac OS X 中的 RegisterEventHotKey()/UnregisterEventHotKey()。
因此,您可以获取显式的组合键,即特定的键和修饰符(XGrabKey() 允许更多),而其他应用程序无法获取。这里不支持按键序列,即连续的按键组合。
<小时/>键盘 Hook 功能更强大,因为它允许查看输入事件(甚至过滤它们)。它不仅被键盘记录器使用,而且它们是这里的典型关联。
如果您使用 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内核中有一个“事件接口(interface)”,称为evdev ,可以在这里利用。详细内容可以参见logkeys Linux keylogger的源代码。也可以使用类似于 evdev 的方法来完成。查看我的 PoC 项目: kaos - 关键事件屏幕显示。
而且我没有 Mac,所以没有进一步的引用。 ;)
关于qt4 - 使用 Qt 4.6 钩住键盘上的键和组合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2980141/