これはどのように行うべきですか :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);
}