1

Mac OSでマウスの右クリックと左クリックをキャプチャし、以下のコードを使用したい:


CGEventRef event = CGEventCreate(NULL);
CGEventType eventType = CGEventGetType(event);

cout << "mouse event type is : " << eventType << endl;

このコードを使用して、たとえば kCGEventLeftMouseDown またはイベント タイプを示す整数値である必要がある eventType を確認しますが、このコードはマウス イベントをキャプチャして 0 を返しません

4

1 に答える 1

2

これはどのように行うべきですか :D 既存のイベントをキャプチャする必要があります...ヘルパーを呼び出して新しいイベントを作成するだけです...しかし、それは非常に簡単です。

CGEventTapあなたが望むことを調べてください。

OS でアクセシビリティが有効になっている場合、イベント タップはシステム全体で機能します。


いくつかのコード:

//called for each event
static CGEventRef myCGEventCallback(CGEventTapProxy proxy, 
                                        CGEventType t,
                                        CGEventRef event,
                                        void *refcon);

- (void)threaded_listenForDrags {
    if (!_eventTap)
    {
        int eventMask = CGEventMaskBit(kCGEventLeftMouseDown)
        | CGEventMaskBit(kCGEventLeftMouseUp) 
        | CGEventMaskBit(kCGEventLeftMouseDragged)
        | CGEventMaskBit(kCGEventRightMouseDragged)
        | CGEventMaskBit(kCGEventOtherMouseDragged);

        _eventTap = CGEventTapCreate(kCGHIDEventTap,
                                    kCGHeadInsertEventTap,
                                    kCGEventTapOptionListenOnly, 
                                    eventMask, 
                                    myCGEventCallback,
                                    (__bridge void*)self);
        if (!_eventTap)
        {
            DDLogError(@"%@ no tap; universal access?", NSStringFromSelector(_cmd));
            return;
        }
        CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(NULL,
                                                                         _eventTap, 0);
        CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, 
                           kCFRunLoopCommonModes);

        CFRelease(runLoopSource);       
    }
    CGEventTapEnable(_eventTap, true);

    CFRunLoopRun();
}

- (void)threaded_endListenForDrags {
    CFMachPortRef et = _eventTap;

    CGEventTapEnable(_eventTap, false);
    _eventTap = nil;

    dispatch_sync(dispatch_get_main_queue(), ^{
        if(_enabled) {
            _enabled = NO;
            [self setEnabled:YES];
        }
    }); 

    CFRunLoopStop(CFRunLoopGetCurrent());
    CFRelease(et);
}
于 2013-04-07T09:03:29.707 に答える