0

我有使用 Qt 构建的 MacOS 应用程序。在那里,我创建了 NSDistributedNotificationCenter 以在可访问性设置更改时收到通知(观察“com.apple.accessibility.api”)。我也有 CFRunLoopAddSource 来监控按键事件。

但是,当我运行程序并更改辅助功能时,应用程序挂起并且无法正常运行。

有人可以帮忙看看为什么会这样吗?

这是代码:

在这里我正在创建观察者:创建/删除由按钮单击控制

- (void)createObserver
{
[[NSDistributedNotificationCenter defaultCenter] addObserver:self
            selector:@selector(didToggleAccessStatus:)
                name:@"com.apple.accessibility.api"
              object:nil
  suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately];
}

这就是我添加关键事件记录器的方式:

// Create an event tap to retrieve keypresses.
CGEventMask eventMask = (CGEventMaskBit(kCGEventKeyDown) | 
CGEventMaskBit(kCGEventFlagsChanged) |
                          CGEventMaskBit(kCGEventLeftMouseDown) |
                          CGEventMaskBit(kCGEventRightMouseDown) |
                          CGEventMaskBit(kCGEventMouseMoved) |
                          CGEventMaskBit(kCGEventScrollWheel));
                                  //| CGEventMaskBit(kCGEventLeftMouseDragged)
                                  //| CGEventMaskBit(kCGEventRightMouseDragged)
                                  //| CGEventMaskBit(kCGEventOtherMouseDragged););
CFMachPortRef           m_eventTap = nullptr;
CFRunLoopSourceRef      m_runLoopSource = nullptr;
 m_eventTap = CGEventTapCreate(
     kCGSessionEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault,
     eventMask, myCGEventCallback, nullptr);

 if (m_eventTap != Q_NULLPTR) {
    NSLog(@"CGEventTap created");
    // Create a run loop source and add enable the event tap.
    m_runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, m_eventTap, 0);
    CFRunLoopAddSource(CFRunLoopGetCurrent()/*CFRunLoopGetMain()*/, m_runLoopSource, kCFRunLoopCommonModes);
    CGEventTapEnable(m_eventTap, true);
    //CFRunLoopRun();
 }
 else {
     m_runLoopSource = Q_NULLPTR;
     NSLog(@"Error creating CGEventTap");
 }

请问有什么想法吗?

提前致谢和问候

4

0 回答 0