Переопределить main.m с циклом выполнения, но все еще добираться до вызова NSApplicationMain? - PullRequest
0 голосов
/ 26 апреля 2011

Извиняюсь, если это глупый / легкий вопрос, но все еще привыкаю ко всему на земле Mac.

Дэйв был достаточно любезен, чтобы ответить на вопрос здесь: Измените NSEvent, чтобы отправить другойчем та, которая была нажата

, что привело к следующему коду, который прекрасно работает:

#import <Cocoa/Cocoa.h>

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    //0x0b is the virtual keycode for "b"
    //0x09 is the virtual keycode for "v"
    if (CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 0x0B) {
        CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, 0x09);
    }

    return event;
}

int main(int argc, char *argv[]) {
    //return NSApplicationMain(argc, (const char **)argv);

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    CFRunLoopSourceRef runLoopSource;

    CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);

    if (!eventTap) {
        NSLog(@"Couldn't create event tap!");
        exit(1);
    }

    runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);

    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);

    CGEventTapEnable(eventTap, true);

    CFRunLoopRun();

    CFRelease(eventTap);
    CFRelease(runLoopSource);
    [pool release];

    exit(0);
}

Благодаря некоторым полезным сообщениям об ошибках (не может быть двух) main"методы) Я понял, что мне нужно поместить этот код в файл main.m (верно?).Это означает, что я перезаписываю метод по умолчанию:

int main(int argc, char *argv[]) {
    return NSApplicationMain(argc, (const char **)argv);
}

Что означает, что ни один из моих других кодов на основе Objective C не запускается.Но если я раскомментирую этот бит (или предприму любую другую попытку вызвать NSApplicationMain), то цикл запуска main.m - это то, что не запускается.

Я думаю, это довольно просто для опытного парня из Mac, но яМне трудно оборачиваться вокруг него.Спасибо.

1 Ответ

1 голос
/ 26 апреля 2011

Я не вижу причин, по которым эта идея не будет работать в других местах вашего кода. Можете ли вы поместить его в метод -applicationDidFinishLaunching: вашего приложения-делегата? Если вы это сделаете, вам не понадобится вызов CFRunLoop(), так как цикл выполнения уже будет запущен. Вам также не понадобится бит пула автоматического выпуска.

...