道歉,如果这是一个愚蠢/简单的问题,但仍然习惯了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家伙来说这很简单,但是我很难绕过它。感谢。
答案 0 :(得分:1)
我认为没有任何理由说明为什么同样的想法在代码的其他地方无效。你能把它放在app代理的-applicationDidFinishLaunching:
方法中吗?如果这样做,您将不需要CFRunLoop()
调用,因为运行循环已经在运行。你也不需要自动释放池位。