如何在OSX上挂钩/重新映射任意键盘事件?

P i*_*P i 6 macos hook key-bindings keyboard-events

我想要映射:

  • CAPS-LOCKFn
  • Fn 到左鼠标
  • LSHIFT+ 3#
  • RSHIFT+ 3 到别的东西
  • 等等

我已经详尽地搜索了任何可以完全自由地重新映射键盘输入的工具,但却无法找到.(Windows有AutoHotkey).

我打算编写自己的工具来解析配置文件.

但是如何实际挖掘并做到这一点?

解决这个问题需要彻底了解通过操作系统进行击键的过程,以便在适当的时候进行拦截.

我想我需要在低级别处吃掉事件,它仍然是一个虚拟密钥代码,然后提供我自己的自定义映射系统并在系统中进一步注入适当的事件.

但在哪里(以及如何)?

编辑:我在下面的答案中详述了我的研究结果(可能应该在某个时候将其迁移回问题).

P i*_*P i 17

我正在制作这个社区维基,欢迎您加以改进.

我问过的子问题:

我可以截取中间层底部的几乎所有keydown/keyup事件.除了电源,以及从ON到OFF转换时的CAPSLOCK键 - UP.

太讨厌了!

在底层工作,我可以获得除PowerKey之外的所有键上/下.

如果不是因为CapsLock的成功率为75%,我会有一个很好的解决方案.令人烦恼的是,在如此有用的位置处理钥匙会大大增加所需的复杂性.

我找到了DDHidLib,目前正在查看它是否能解决这个问题.

研究

谷歌搜索"keyEventWithType CGEventTapCreate"似乎是一个好主意,因为这些是挖掘事件和重新发射它的必要因素.

好极了!修改keyDown输出 - 该代码编译,并通过小调整(CGEventMaskBit( kCGEventKeyDown ) | CGEventMaskBit( kCGEventFlagsChanged ),)我也可以获取修改键.我为LSHIFT和RSHIFT获得了不同的密钥代码.辉煌!

以上问题:

  • 点击kCGEventKeyDown适用于某些功能键但不适用于其他功能键.看起来苹果只是重载某些键,而重载的键似乎陷入了较低的水平.
  • 电源/弹出键不会被捕获.
  • 我没有看到任何方法来消除键击来自哪个设备的歧义.

如何在MacBook键盘上点击(挂钩)F7至F12和电源/弹出

http://blog.tklee.org/2008/09/modifiers-across-keyboards.html
- > http://forums.macrumors.com/showthread.php?t=778484
- > https://github.com/的Maravillas /双键盘

https://github.com/pkamb/PowerKey可能会提供一些见解
- > https://github.com/pkamb/PowerKey/blob/master/PowerKey/PKPowerKeyEventListener.m
- > Apple键盘媒体键事件处理 - Rogue Amoeba
... Mac OS X的系统级快捷方式
- > http://snippets.aktagon.com/snippets/361-registering-global-hot-keys-with-cocoa-and-objective-c

另一个问题是:LSHIFT-down RSHIFT-down&up LSHIFT-up.RSHIFT事件不会被抓住.

看起来我需要深入了解IOKit

使用IOHIDManager获取修改键事件
- > https://github.com/candera/khordr/blob/master/src/c/keygrab/hid-scratch.c

kEventRawKeyDown:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/
Developer/SDKs/MacOSX10.10.sdk/System/Library/
Frameworks//Carbon.framework/Frameworks/HIToolbox.framework/
Headers/CarbonEvents.h
Run Code Online (Sandbox Code Playgroud)

资源

3层:

  • Cocoa/AppKit是一个更高级别的包装器
  • Quartz从IOKit获取事件将它们路由到应用程序
    注意:NSEvent是在Quartz Event上构建的

  • IOKit - 与硬件对话

3层

顶级(可可/ AppKit)

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/EventOverview/EventArchitecture/EventArchitecture.html - 这个文件是必看的,并显示了上面的基本3层架构pic.但是,它似乎只专注于顶层(Cocoa/AppKit).

http://www.hcs.harvard.edu/~jrus/Site/Cocoa%20Text%20System.html < - 本文向您展示了3个OSX配置文件,它们可以在更高级别运行,让您编写自己的映射脚本.这在此处记录.

^ KeyBindingsEditor允许您进行上述修改.

中层(石英)

QuartzEventServicesRef

NSEvent - 专门创建事件

这个级别的一些工作代码示例.但是,它们都执行接收一个虚拟密钥代码并发出另一个虚拟密钥代码的相同基本技巧.因此,您可以使用此技术来交换"a"和"z".

截取OSX中的键盘输入 - 导致Quartz事件选通

修改NSEvent以发送与按下的键不同的密钥--Dave De Long提供了一个工作示例,也使用了QET.

https://gist.github.com/wewearglasses/8313195 < - "OSX的全局键盘钩子" - 另一个使用QET的简短工作演示.

Ukelele允许您选择与特定键或Modifier +键关联的Unicode.不允许重新映射修改器,也不允许从右移键等消除左侧的歧义.

OSX上的键盘输入 - addGlobalMonitorForEventsMatchingMask在NSEvent中回答指向(在AppKit中)

基层(IOKit)

IOKitFundamentals < - 还有IOKit("I/O Kit中的中断处理......两种类型的事件触发中断:......异步事件,如键盘按下")

https://developer.apple.com/library/mac/documentation/DeviceDrivers/Conceptual/AccessingHardware/AH_Other_APIs/AH_Other_APIs.html

Mac OS X游戏如何接收低级键盘输入事件?< - 游戏玩家对此感兴趣!

http://phrack.org/issues/66/16.html#article - 有时黑客最清楚地呈现内容,还没有读过这篇文章.似乎IOKit了.


更多链接......

如何在Mac OS X中实现全局键盘挂钩?< - 链接到文章.

OSX:检测系统范围的keyDown事件?< - 稍微OT,因为这只与全局监控有关,即只读.

http://www.codeitive.com/7QHSeVjPWq/where-can-i-find-kcgkeyboardeventkeycode-list-of-key-codes-for-cyrillic-language.html


归档时间:

查看次数:

2793 次

最近记录:

8 年,5 月 前