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