Capslock のプレスをグローバルにインターセプトしてブロックするために、Quartz CGEventTap を使用しています (代わりに何か役に立つことをさせるため)。capslock の押下を検出することに成功しましたが、これまでのところそれらをブロックできませんでした。私のコード(このスタックオーバーフローの回答に由来する)は次のようなものです:
eventTap = CGEventTapCreate(kCGHIDEventTap,
kCGTailAppendEventTap,
kCGEventTapOptionDefault,
eventMask,
myCGEventCallback,
&oldFlags);
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef theEvent, void *refcon)
{
CGEventFlags *oldFlags = (CGEventFlags *)refcon;
switch (type)
{
case kCGEventFlagsChanged:
{
CGEventFlags newFlags = CGEventGetFlags(theEvent);
CGEventFlags changedFlags = *oldFlags ^ newFlags;
*oldFlags = newFlags;
if (changedFlags == 65536)
{
NSLog(@"Capslock pressed. Let's not return the event");
return NULL;
}
break;
}
default:
break;
}
NSLog(@"Different modifier than capslock. Returning the event");
return theEvent;
}
私が正しく NULL を返すことを理解していれば、キープレスの伝播を効果的にブロックするはずです。実際、「通常の」キーアップおよびキーダウン イベントでも同様です。ただし、capslock は関係なくトグルします。それはなぜですか?私は間違った仮定をしていますか? および/または、目標を達成するためにどうすれば別のことを行うことができますか?
ありがとう、
ソー