这应该是怎么做的: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);
}
请重写问题标题和体内过多,使其更容易得到你想要的东西:) – 2013-04-07 09:07:29