Я пытаюсь написать код, который отбрасывает все события клавиатуры и мыши при включении на 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 четко указано:
Если кран события является активным фильтром, функция обратного вызова должна возвращать одно из следующих значений:
(возможно, измененное) событие, которое передается. Это событие передается обратно в систему событий.
Недавно построенное событие. После того как новое событие будет возвращено в систему событий, новое событие будет выпущено вместе с оригинальным событием.
NULL, если событие прошло, должно быть удалено.
Я возвращаю NULL, но событие, похоже, не удаляется. Любые идеи?