5

10.6 以降用に作成したアプリケーションを 10.5 以降で動作するように更新 (ダウンデート?) しています。現在押されているマウス ボタンを-(void)menuWillOpen:(NSMenu *);セレクターでキャプチャするのに苦労しています。

10.6 以降では[NSEvent pressedMouseButtons]、イベント ストリームの外で押されたボタンを取得できる を利用しています。ただし、これは 10.5 以降には存在しません ( [theEvent buttonNumber].

押されたマウス ボタン (右または左) をキャプチャするにはどうすればよいですか。

  1. 私の NSMenu デリゲートの内部
  2. -(void)menuWillOpen:(NSMenu *)menuできればセレクターの内側に
  3. 10.5+ と 10.6+ の両方で動作するマナーで

私は本当に助けに感謝し、StackOverflow が新しい Objective-C プログラマーを助けることを知っています!

ありがとう、ダスティン

4

2 に答える 2

6

最後に、次のように呼び出して現在のマウス ボタンを取得することができました (助けてくれたNick Paulsonに感謝します)。

[[[NSApplication sharedApplication] currentEvent] buttonNumber]

ughoavgfhwが指摘したように、同じイベントをフェッチするより短い方法は次のとおりです。

[[NSApp currentEvent] buttonNumber]

于 2010-12-19T19:11:26.590 に答える
2

もう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]あなたが望むことをするなら、私は間違いなくそれで行きます。それはより高いレベルであり、したがってより少ないコードです。

于 2010-12-19T16:28:14.757 に答える