CapsLock appears to be one of the two most difficult keys to reassign (the other is the power button).
I can globally intercept NSEvent's:
_eventTap = CGEventTapCreate( kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, CGEventMaskBit( kCGEventFlagsChanged ), (CGEventTapCallBack)_tapCallback, (__bridge void *)(self)); :
However, I do not receive an event for each key up / down. This actually happens:
(CapsLock initial state is off)
Key down: NSSystemDefined: 40a00 NSSystemDefined: 40b00 (Green light is currently on)
Key: NSSystemDefined: 40b00
Key down: NSSystemDefined: 40a00 (Green light is currently off)
Key: (nothing)
Therefore, I cannot display at this level.
But I thought that I could track at a lower level using IOKit, which defines every keystroke / up event, and then eats up the CAPSLOCK events at that level (returning 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; :
However, this does not stop CapsLock from doing its job (such as capital letters).
I even tried to remove the CapsLock modifier flag from each keyboard event inside the handler:
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 ];
... but no luck!
Is there any way to tame this annoying CapsLock key?
EDIT: How to simulate a Caps Lock keypress using CGEventCreateKeyboardEvent in OS X