如何在可可中捕获全局 keydown/keyup 事件

发布于 2024-11-16 21:40:06 字数 100 浏览 3 评论 0原文

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

谢谢

I want to trap, modify and divert all the keydown/keyup events in the system within my cocoa app. I know about CGEventTapCreate but, didn't found any working code from net.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

追风人 2024-11-23 21:40:06

找到解决方案:

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

Found Solution:

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

            }
        }

Properties :

CFMachPortRef machPortRef;
CFRunLoopSourceRef  eventSrc;

Event Handler:

 CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    //printf("eventTap triggered\n");
    return event;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文