もう1つの方法は、マウスダウンイベントをキャプチャするCGEventTapを作成することです。
次に、最後のイベントタイプを覚えて、NSMenuデリゲートメソッドの1つでそれを確認する必要があります。
サンプルコードは次のとおりです。
CGEventRef MouseClickedEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon)
{
CGPoint location = CGEventGetLocation(event);
switch (type)
{
case kCGEventLeftMouseDown:
{
NSLog(@"Left Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventRightMouseDown:
{
NSLog(@"Right Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
case kCGEventOtherMouseDown:
{
NSLog(@"Other Mouse pressed at %@", NSStringFromPoint(NSPointFromCGPoint(location)));
break;
}
default:
break;
}
return event;
}
- (void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
CGEventMask eventMask = CGEventMaskBit(kCGEventLeftMouseDown)|CGEventMaskBit(kCGEventRightMouseDown)|CGEventMaskBit(kCGEventOtherMouseDown);
CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, eventMask, MouseClickedEventCallback, NULL);
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
}
Quartz Event Servicesのドキュメントには、次のように記載されています。
次のいずれかの条件が当てはまる場合、イベントタップはキーアップイベントとキーダウンイベントを受け取ります。
- 現在のプロセスはrootユーザーとして実行されています。
- 支援機器へのアクセスが有効になっています。Mac OS X v10.4では、システム環境設定、ユニバーサルアクセスパネル、キーボードビューを使用してこの機能を有効にできます。
私はそれを再確認しましたが、支援機器がマウスイベントを受信できるようにする必要は本当にないようです。
しかし、[[[NSApplication sharedApplication] currentEvent] buttonNumber]
あなたが望むことをするなら、私は間違いなくそれで行きます。それはより高いレベルであり、したがってより少ないコードです。