Я пытаюсь переназначить 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, которые отменят действие реальных?