Как использовать событие CAPS-LOCK в MacOS - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь переназначить CAPS-LOCK.

Я могу успешно обнаруживать события нажатия / повышения CAPS-LOCK, используя CGEventTap.

Однако я не могу потреблять их. (OTOH I способен использовать обычные события нажатия / повышения).

Ниже приведен фрагмент кода:

@implementation Intercept

- (BOOL) tapEvents
{
    _eventTap = CGEventTapCreate( kCGHIDEventTap, // kCGSessionEventTap,
                                  kCGHeadInsertEventTap,
                                  kCGEventTapOptionDefault,
                                       CGEventMaskBit( NSEventTypeKeyDown )
                                     | CGEventMaskBit( NSEventTypeFlagsChanged )
                                     | CGEventMaskBit( NSEventTypeSystemDefined ),
                                  (CGEventTapCallBack) tapCallback,
                                  (__bridge void *)(self));
    CGEventTapEnable( _eventTap, YES );
}


CGEventRef tapCallback(
                        CGEventTapProxy proxy,
                        CGEventType     type,
                        CGEventRef      event,
                        Intercept*     listener
                        )
{
    return [listener interceptEvent:event];
}


- (CGEventRef)interceptEvent:(CGEventRef)cgEvent
{    
    NSEvent* event = [NSEvent eventWithCGEvent:cgEvent];

    /*
     CAPSLOCK sends:
       (1) NSEventTypeSystemDefined
       (2) NSEventTypeFlagsChanged
     */

    switch( event.type ) {
        // if I return NULL here, it DOESN'T eat CAPS-LOCK
        case NSEventTypeFlagsChanged:
        case NSEventTypeSystemDefined:
            return NULL;

        // if I return NULL here, it DOES eat keystrokes
        case NSEventTypeKeyDown:
            return NULL;
    }

    CGEventRef ev = [event CGEvent];
    CFRetain(ev);
    return ev;
}

Почему этот один ключ избегает правил, связывающих остальные?

Должен ли я перейти на слой IOHID?

REF: Программная симуляция / переключение CAPS LOCK в OS X

В качестве альтернативы, имеет ли смысл вводить события противоядия CAPS-LOCK, которые отменят действие реальных?

...