Events 如何在cocoa中捕获全局keydown/keydup事件

Events 如何在cocoa中捕获全局keydown/keydup事件,events,keyboard,global,Events,Keyboard,Global,我想在我的cocoa应用程序中捕获、修改和转移系统中的所有keydown/keydup事件。我知道CGEventTapCreate,但没有从网络上找到任何工作代码 感谢找到解决方案: self.machPortRef = CGEventTapCreate(kCGSessionEventTap, kCGTailAppendEventTap,

我想在我的cocoa应用程序中捕获、修改和转移系统中的所有keydown/keydup事件。我知道CGEventTapCreate,但没有从网络上找到任何工作代码

感谢找到解决方案:

self.machPortRef =  CGEventTapCreate(kCGSessionEventTap,
                                             kCGTailAppendEventTap,
                                             kCGEventTapOptionDefault,
                                             CGEventMaskBit(kCGEventKeyDown),
                                             (CGEventTapCallBack)eventTapFunction,
                                             self);
        if (self.machPortRef == NULL)
        {
            printf("CGEventTapCreate failed!\n");
        } else {
            self.eventSrc = CFMachPortCreateRunLoopSource(NULL, self.machPortRef, 0);
            if ( self.eventSrc == NULL )
            {
                printf( "No event run loop src?\n" );
            }else {
                CFRunLoopRef runLoop =  CFRunLoopGetCurrent(); //GetCFRunLoopFromEventLoop(GetMainEventLoop ()); 

                // Get the CFRunLoop primitive for the Carbon Main Event Loop, and add the new event souce
                CFRunLoopAddSource(runLoop, self.eventSrc, kCFRunLoopDefaultMode);

            }
        }
特性:

CFMachPortRef machPortRef;
CFRunLoopSourceRef  eventSrc;
事件处理程序:

 CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    //printf("eventTap triggered\n");
    return event;
}