如何在OSX上重新映射CAPSLOCK?

时间:2015-05-30 09:19:09

标签: macos keyboard-events capslock

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

1 个答案:

答案 0 :(得分:0)

我相信 Karabiner Elements 是用它自己的键盘驱动程序做到的,看看源代码。