你不能用NSEvent
API來做到這一點,但你可以用可以用CGEventTap
做到這一點。您可以創建一個活動事件點擊並註冊a callback,該點接收CGEventRef
,並可以對其進行修改(如有必要)並將其返回以修改實際的事件流。
編輯
這裏有一個簡單的程序,運行時,將替換所有的 「B」 鍵擊帶有 「V」:
#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[]) {
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);
}
(有趣的故事:我在編這篇文章中,我一直試圖寫「替換每一個'b'keystroke」,但它一直以「替換每個'v'keystroke」的形式出現。我很困惑,然後我記得我還沒有停止過應用程序)
相當新的Objective-C ...幫助一些示例代碼?這與我以上的所有相似嗎? – cksubs 2011-04-26 05:02:41
如果有幫助:CGEvent apis都是C.不需要objc。 – justin 2011-04-26 05:23:51
@cksubs編輯答案。 – 2011-04-26 05:50:11