热键的事件点击(CFMachPortRef)问题 - 回调未被调用

问题描述 投票:0回答:2

我正在开发一个通过热键支持其中一项功能的桌面应用程序。我正在使用 Event Tap 为此工作。

但是,有时(随机地)不调用回调;热键不起作用,因此该功能似乎不起作用。

如何确定这里的问题?

以下是代码片段:

-( void )startEventTapinThread //Called in a separate thread.
{
    NSAutoreleasePool *pool =[ [ NSAutoreleasePool alloc] init];
    
    CFRunLoopRef runloop =(CFRunLoopRef)CFRunLoopGetCurrent();
    CGEventMask interestedEvents = CGEventMaskBit(kCGEventFlagsChanged)|CGEventMaskBit(kCGEventKeyDown);
    CFMachPortRef eventTap = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap, 0, interestedEvents, myCGEventCallback, self); //self is the object pointer our method
    CFRunLoopSourceRef source = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
    CFRunLoopAddSource((CFRunLoopRef)runloop , source, kCFRunLoopCommonModes);
    CFRunLoopRun();
    [ pool release];
}

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
    CGEventType eventType = CGEventGetType(event);
    //execute the code related to feature
}
macos callback invoke hotkeys cgeventtap
2个回答
1
投票

我会通过事件

kCGEventMaskForAllEvents
而不是只为某些事件设置挂钩。

然后,在你的回调函数中,过滤事件。

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{

if (type == kCGEventTapDisabledByTimeout) {
    NSLog(@"Event Taps Disabled! Re-enabling");
    CGEventTapEnable(eventTap, true);
    return event;
}

if (type == kCGEventLeftMouseDown) {
    //...
}

if (type != kCGEventKeyDown) {
    //...
}

if (type == kCGEventKeyDown) {
    //...
}

0
投票

您的问题的解决方案很可能在这个问题的最佳答案中描述。如果我有这样的代表分数,我会把这个问题标记为一个骗局。

© www.soinside.com 2019 - 2024. All rights reserved.