CGEventTap блокирует ввод приложения - PullRequest
4 голосов
/ 19 февраля 2011

Я пытаюсь использовать CGCreateEventTap для мониторинга глобальных щелчков мыши, однако, когда я делаю это, кажется, блокирует взаимодействие с моим собственным приложением.Щелчки мыши в других запущенных приложениях работают нормально, но мое собственное приложение (то есть приложение DemoAppDelegate) не отвечает полностью.Я могу перетащить главное окно приложения, но красные / желтые / зеленые кнопки окна неактивны.И в меню DemoApp тоже нельзя кликнуть.

Это кажется мне очень странным, и я не смог этого понять.Примеров использования событийных событий мало и они далеко друг от друга, поэтому любые советы приветствуются.

#import "DemoAppDelegate.h"

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    CGPoint location = CGEventGetLocation(event);
    NSLog(@"location:  (%f, %f) - %@\n", location.x, location.y, (NSString*)refcon);
    return event;
}

@implementation DemoAppDelegate
@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    CFMachPortRef eventTap;
    CGEventMask        eventMask;
    CFRunLoopSourceRef runLoopSource;
    eventMask = 1 << kCGEventLeftMouseDown;
    eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
                                1, eventMask, myCGEventCallback, @"mydata");
    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource,
                       kCFRunLoopCommonModes);
    CGEventTapEnable(eventTap, true);
    CFRunLoopRun();
}
@end

1 Ответ

8 голосов
/ 19 февраля 2011

Когда вы создаете приложение Какао, -[NSApplication run] отвечает за запуск цикла событий - он запускает цикл выполнения и отправляет события.Это означает, что вы должны удалить этот вызов

CFRunLoopRun();

в нижней части реализации -applicationDidFinishLaunching: метода, поскольку он предотвращает возврат -applicationDidFinishLaunching: и также NSApplication от отправки событий.

...