用运行循环覆盖main.m但仍然进入NSApplicationMain调用?

时间:2011-04-26 08:12:23

标签: objective-c c xcode

道歉,如果这是一个愚蠢/简单的问题,但仍然习惯了Mac领域的一切。

戴夫很友善地在这里为我回答一个问题: Modify NSEvent to send a different key than the one that was pressed

导致以下代码,效果很好:

#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);
}

感谢一些有用的错误消息(无法使用两个&#34; main&#34;方法)我发现我必须将此代码放在main.m文件中(对吗?)。这意味着我将覆盖默认方法:

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

这意味着我的其他基于Objective-C的代码都没有被触发。但如果我取消注释该位(或进行任何其他尝试调用NSApplicationMain),那么main.m运行循环就不会运行。

我认为对于一个经验丰富的Mac家伙来说这很简单,但是我很难绕过它。感谢。

1 个答案:

答案 0 :(得分:1)

我认为没有任何理由说明为什么同样的想法在代码的其他地方无效。你能把它放在app代理的-applicationDidFinishLaunching:方法中吗?如果这样做,您将不需要CFRunLoop()调用,因为运行循环已经在运行。你也不需要自动释放池位。