Правильное обнаружение событий CAPSLOCK в MacOS - PullRequest
0 голосов
/ 25 мая 2019

Я создаю событие Tap:

_eventTap = CGEventTapCreate( kCGHIDEventTap, // kCGSessionEventTap,
                              kCGHeadInsertEventTap,
                              kCGEventTapOptionDefault,
                                   CGEventMaskBit( kCGEventKeyDown )
                                 | CGEventMaskBit( kCGEventFlagsChanged )
                                 | CGEventMaskBit( NSSystemDefined )
                                 ,
                              (CGEventTapCallBack)_tapCallback,
                              (__bridge void *)(self));
}
CGEventTapEnable( _eventTap, YES );

Регистрируя выходные данные из события, я могу определить следующее:

/* CAPS-LOCK
 (values in hex)
 NOTE: NSEventModifierFlagCapsLock = 1 << 16 = 0x10000

 (Initially OFF)

 DOWN (green light comes on)
     NSEventTypeSystemDefined: data1=40a00  event.modifierFlags: 10000
     NSEventTypeFlagsChanged: 10000         event.modifierFlags: 10000

 UP
     NSEventTypeSystemDefined: data1=40b00  event.modifierFlags: 10000

 DOWN (green light goes off)
     NSEventTypeSystemDefined: data1=40a00  event.modifierFlags: 0
     NSEventTypeFlagsChanged: 0             event.modifierFlags: 0

 UP
     NSEventTypeSystemDefined: data1=40b00  event.modifierFlags: 0

 40a00 = b1000000101000000000
 40b00 = b1000000101100000000
 ^     = b0000000000100000000 = 1 << 8
 */

Поэтому я могу написать следующий код:

{
    bool capslock_down  = event.type == NSEventTypeSystemDefined  &&  event.data1 == 0x40a00;
    bool capslock_up    = event.type == NSEventTypeSystemDefined  &&  event.data1 == 0x40b00;
    bool capslock_now_active = event.modifierFlags & NSEventModifierFlagCapsLock;

    if( capslock_down )  printf( "capslock_down, %s \n", capslock_now_active ? "ACTIVE" : "inactive" );
    if( capslock_up   )  printf( "capslock_up  , %s \n", capslock_now_active ? "ACTIVE" : "inactive" );
}

Однако, это плохая практика - жестко кодировать эти значения 0x40a00, 0x40b00.

Что именно содержит event.data1, когда event.type == NSEventTypeSystemDefined?

Где я могу найти соответствующую документацию?

(NSEvent.h определяет NSScrollLockFunctionKey = 0xF72F, но это как можно ближе).

...