Я создаю событие 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
, но это как можно ближе).