Я пытаюсь написать код, который отбрасывает все события клавиатуры и мыши при включении в 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, но событие, похоже, не удалено.Есть идеи?