Estoy tratando de escribir algún código que descarte todos los eventos de teclado y mouse cuando está habilitado en Mac OSX 10.6. Mi código se ejecuta como el usuario raíz. El enfoque que estoy tomando es crear un toque de evento que descarte todos los eventos que se le pasen (mientras está habilitado). La función de devolución de llamada de eventos del grifo se ve así:El toque de evento de Mac solo retrasa los eventos descartados
CGEventRef MyTapCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
return CKeyLocker::isEnabled() ? NULL : event;
}
Y el código que estoy usando para activar y desactivar el grifo evento es el siguiente:
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";
}
}
Este enfoque funciona muy bien, mientras que el grifo evento está activo: puedo presionar el teclado y el mouse tanto como quiera y ningún evento lo hace a través del sistema. Sin embargo, cuando el tap está desactivado, todas las teclas que presioné mientras el tap estaba activo aparecen en la ventana actual. Es como el grifo evento es muy retrasar los eventos, en lugar de destruirlas, lo cual es extraño, ya que la documentación de Mac indica claramente:
Si el grifo evento es un filtro activo, la función de devolución de llamada debe devolver uno de los siguiente:
El evento (posiblemente modificado) que se transfiere. Este evento se devuelve al sistema de eventos.
Un evento de nueva construcción. Después de que el nuevo evento haya sido devuelto al sistema de eventos, el nuevo evento se lanzará junto con el evento original.
NULL si se debe eliminar el evento pasado.
Estoy devolviendo NULL, pero el evento no parece ser eliminado. ¿Algunas ideas?
los solucionaron este problema? Acabo de encontrar exactamente el mismo comportamiento. – Dan
no, desafortunadamente no. – Thomi
Vea también http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap – James