Я получил некоторый код из консольного приложения, которое я написал, и я пытаюсь приспособиться для использования в приложении на основе пользовательского интерфейса. Он регистрирует ловушку событий для контроля всей системы перемещения мыши. Кто-то посоветовал мне создать и запустить поток для настройки цикла событий, чтобы я не блокировал приложение (код вызывается из applicationDidFinishLaunching).
Я должен быть честным, я просмотрел несколько документов о циклах выполнения и совершенно запутался :-( Мой код просто зависает при вызове функции listen
.
static MouseListener* listener = nil;
CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
event = [listener eventOccurred:proxy:type:event:refcon];
[pool release];
return event;
}
@implementation MouseListener
-(MouseListener*) myinit {
if (self = [super init]) {
eventThread = [[NSThread alloc] initWithTarget:self
selector:@selector(listen:)
object:nil];
[eventThread start];
}
return self;
}
-(void)listen:(NSObject*) object {
if (!listener) {
listener = self;
CFMachPortRef tap = CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
NSAnyEventMask,
eventOccurred,
NULL);
if (tap) {
CFRunLoopRef loop = CFRunLoopGetCurrent();
CFRunLoopSourceRef src = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
CFRunLoopAddSource(loop, src, kCFRunLoopCommonModes);
CGEventTapEnable(tap, true);
//CFRunLoopRun();
//[[NSRunLoop currentRunLoop] run];
CFRelease(src);
CFRelease(tap);
}
}
}
-(CGEventRef) eventOccurred:(CGEventTapProxy) proxy: (CGEventType) type: (CGEventRef) event: (void*) refcon {
// Do stuff, never gets called
return event;
}