Касание события Mac просто задерживает отброшенные события

Я пытаюсь написать некоторый код, который отбрасывает все события клавиатуры и события от нажатия мыши при включении на Mac OSX 10.6. Мой код работает как пользователь root. Подход, который я проявляю, должен создать касание события, которое отбрасывает все события, переданные ему (в то время как включено). Функция обратного вызова касания события похожа на это:

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

И код, который я использую, чтобы включить и отключить касание события, похож на это:

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

Этот подход работает очень хорошо, в то время как касание события активно - я могу стучать на клавиатуре и мыши так, как я хочу, и никакие события не делают его через систему. Однако, когда касание отключено все ключи, я продвинул, в то время как касание было активно, появляются в текущем окне. Это похоже на касание события, просто задерживает события, вместо того, чтобы уничтожить их, который нечетен, так как документация Mac ясно указывает:

Если касание события является активным фильтром, Ваша функция обратного вызова должна возвратить одно из следующего:

(Возможно измененный) событие, которое передается в. Это событие пасуется назад к системе событий.

Недавно созданное событие. После того, как новое событие пасовалось назад к системе событий, новое событие будет выпущено наряду с исходным событием.

ПУСТОЙ УКАЗАТЕЛЬ, если событие передало в, должен быть удален.

Я возвращаю ПУСТОЙ УКАЗАТЕЛЬ, но событие, кажется, не удалено. Какие-либо идеи?

18
задан STW 7 August 2013 в 17:25
поделиться