如何使用c ++在MAC OS中捕获鼠标事件

时间:2013-04-07 08:32:44

标签: c++ macos

我想在Mac os中捕获鼠标右键和左键并使用下面的代码:


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

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

我使用此代码查看eventType,例如必须是kCGEventLeftMouseDown或显示事件类型的整数值,但此代码不捕获鼠标事件并返回0

1 个答案:

答案 0 :(得分:2)

这应该怎么做任何事情:D你需要捕捉现有事件......你只需要召唤一个帮手并制作一个新事件......但这很简单。

查看符合您要求的CGEventTap

事件在系统范围内工作,因为操作系统已启用辅助功能!


一些代码:

//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);
}
相关问题