Mac事件点击只会延迟丢弃的事件

Tho*_*omi 18 c++ macos events macos-carbon quartz-graphics

我正在尝试编写一些在Mac OSX 10.6上启用时丢弃所有键盘和鼠标事件的代码.我的代码以root用户身份运行.我正在采取的方法是创建一个事件点击,丢弃传递给它的所有事件(启用时).事件点击回调函数如下所示:

CGEventRef MyTapCallback(CGEventTapProxy proxy,
                         CGEventType type,
                         CGEventRef event,
                         void *refcon)
{
    return CKeyLocker::isEnabled() ? NULL : event;
}
Run Code Online (Sandbox Code Playgroud)

我用来启用和禁用事件tap的代码如下所示:

void CKeyLocker::enable(bool bEnable)
{
    if (bEnable == m_bEnabled)
        return;

    if (bEnable)
    {
        // which events are we interested in?
        CGEventMask evMask = kCGEventMaskForAllEvents;
        CFMachPortRef mp = CGEventTapCreate(kCGHIDEventTap,
                                            kCGHeadInsertEventTap,
                                            kCGEventTapOptionDefault,
                                            evMask,
                                            MyTapCallback,
                                            NULL);

        if (mp)
        {
            qDebug() << "Tap created and active. mp =" << mp;
            m_enabledTap = mp;
            m_bEnabled = true;
        }
    }
    else
    {
        CGEventTapEnable(m_enabledTap, false);
        CFRelease(m_enabledTap);
        m_enabledTap =0;
        m_bEnabled = false;
        qDebug() << "Tap destroyed and inactive";
    }
}
Run Code Online (Sandbox Code Playgroud)

事件点击处于活动状态时,此方法非常有效 - 我可以根据需要在键盘和鼠标上敲击,并且没有任何事件通过系统.但是,当点击被禁用时,我在点击激活时按下的所有键都出现在当前窗口中.这就像事件点击只是推迟事件,而不是摧毁它们,这很奇怪,因为Mac文档明确指出:

如果事件tap是活动过滤器,则回调函数应返回以下之一:

传入的(可能已修改的)事件.此事件将传递回事件系统.

新建的活动.将新事件传递回事件系统后,新事件将与原始事件一起发布.

如果要删除传入的事件,则为NULL.

我正在返回NULL,但事件似乎没有被删除.有任何想法吗?

val*_*exa 0

我可以验证返回 NULL 确实有效地删除了一些事件,但我也见过几次它没有删除的情况,具体如何决定允许哪些删除尚不清楚,但看起来大规模删除似乎被阻止了,例如:当您删除超过连续 100 个左右的事件。