CapsLock似乎是重新映射的两个最棘手的键之一(另一个是电源按钮)。
我可以全局拦截NSEvent-s:
_eventTap = CGEventTapCreate( kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit( kCGEventFlagsChanged ),
(CGEventTapCallBack)_tapCallback,
(__bridge void *)(self));
:
但是,我没有为每个键上/下获得一个事件。实际发生的是:
(CapsLock的初始状态关闭)
按键: NSSystemDefined:40a00 NSSystemDefined:40b00 (此时绿灯亮起)
关键词: NSSystemDefined:40b00
按键: NSSystemDefined:40a00 (此时绿灯熄灭)
按键:(没有)
所以我无法在这个级别进行映射。
但我认为我可以在较低级别使用IOKit监视,它会检测每个键盘按键/向上事件,然后在此级别吃掉CAPSLOCK事件(通过返回NULL):
- (CGEventRef)processEvent:(CGEventRef)cgEvent
{
NSEvent* event = [NSEvent eventWithCGEvent:cgEvent];
NSUInteger modifiers = [event modifierFlags] &
( NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask | NSControlKeyMask | NSAlphaShiftKeyMask );
NSUInteger flags_changed = _modifiers ^ modifiers;
if( flags_changed & NSAlphaShiftKeyMask )
{
NSLog( @"Eating CAPSLOCK" );
return NULL;
}
_modifiers = modifiers;
:
然而,这并不妨碍CapsLock做其事(即大写字母)。
我甚至尝试从处理程序中的每个键盘事件中删除CapsLock修饰符标志:
if( modifiers & NSAlphaShiftKeyMask )
event = [NSEvent keyEventWithType: event.type
location: NSZeroPoint
modifierFlags: event.modifierFlags & ! NSAlphaShiftKeyMask
timestamp: event.timestamp
windowNumber: event.windowNumber
context: event.context
characters: event.characters
charactersIgnoringModifiers: event.charactersIgnoringModifiers
isARepeat: event.isARepeat
keyCode: event.keyCode ];
......但没有运气!
有没有办法驯服这个讨厌的CapsLock密钥?
编辑:How to simulate Caps Lock keystroke with CGEventCreateKeyboardEvent in OS X
答案 0 :(得分:0)
我相信 Karabiner Elements 是用它自己的键盘驱动程序做到的,看看源代码。