2013-04-07 79 views
1

我想捕捉在Mac OS鼠标右键和左键并使用下面的代码:如何捕获鼠标事件在Mac OS中使用C++


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

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

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

+0

请重写问题标题和体内过多,使其更容易得到你想要的东西:) – 2013-04-07 09:07:29

回答

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); 
} 
+0

添加一些代码 – 2013-04-07 09:06:33