CapsLock は、再マッピングが最も難しい 2 つのキー (もう 1 つは電源ボタン) の 1 つです。
NSEvent-s をグローバル インターセプトできます。
_eventTap = CGEventTapCreate( kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit( kCGEventFlagsChanged ),
(CGEventTapCallBack)_tapCallback,
(__bridge void *)(self));
:
ただし、キーの上下ごとにイベントを取得しません。実際に何が起こるかは次のとおりです。
(CapsLock オフの初期状態)
Key down: NSSystemDefined: 40a00 NSSystemDefined: 40b00 (この時点で緑色のライトが点灯しています)
キーアップ: NSSystemDefined: 40b00
キーダウン: NSSystemDefined: 40a00 (この時点で緑色のライトはオフになっています)
キーアップ: (何もしない)
なので、このレベルではマップできません。
しかし、キーボードのキーダウン/アップイベントをすべて検出するIOKitを使用して、より低いレベルで監視し、このレベルでCAPSLOCKイベントを食べることができると考えました(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;
:
ただし、これは CapsLock の機能 (つまり、タイプされた文字の大文字化) を妨げるものではありません。
ハンドラー内のすべてのキーボード イベントから CapsLock 修飾子フラグを削除しようとさえしました。
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 ];
...しかし、運が悪い!
このやっかいな CapsLock キーを手なずける方法はありますか?
編集: OS X で CGEventCreateKeyboardEvent を使用して Caps Lock キーストロークをシミュレートする方法