5

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 キーストロークをシミュレートする方法

4

1 に答える 1