Вы не можете сделать это с NSEvent
API, но вы можете сделать это с CGEventTap
.Вы можете создать активную запись события и зарегистрировать обратный вызов , который получает 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 »», но оно продолжало появляться как «заменяет каждое нажатие клавиши« v »». Я был сбит с толку. Потом я вспомнил, что не остановил приложениееще.)