Estoy usando CGEventTapCreate
para "robar" las claves multimedia de iTunes cuando se está ejecutando mi aplicación. El código dentro de la devolución de llamada que paso al CGEventTapCreate
examina el evento, y si encuentra que es una de las claves de medios, publica una notificación apropiada al centro de notificaciones predeterminado.CGEventTapCreate se descompone misteriosamente con eventos "key down"
Ahora, esto funciona bien si publico una notificación para el evento de "activación". Si hago eso para eventos de "reducción de teclas", eventualmente mi aplicación deja de recibir eventos de tecla multimedia y iTunes toma el control. ¿Alguna idea sobre lo que puede estar causando esto? La parte pertinente del código está por debajo
enum {
...
PlayPauseKeyDown = 0x100A00,
PlayPauseKeyUp = 0x100B00,
...
};
static CGEventRef event_tap_callback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
if (!(type == NX_SYSDEFINED) || (type == NX_KEYUP) || (type == NX_KEYDOWN))
return event;
NSEvent* keyEvent = [NSEvent eventWithCGEvent: event];
if (keyEvent.type != NSSystemDefined) return event;
switch(keyEvent.data1)
{
case PlayPauseKeyUp: // <--- this works reliably
//case PlayPauseKeyDown: // <--- this will break eventually
post_notification(@"PlayPauseMediaKeyPressed", nil, nil);
return NULL;
... and so on ...
Parece ser un problema de tiempo. Se reemplazó la post_notificación por suspensión (1) y allí está, después de unas pocas pulsaciones de teclas, iTunes roba las teclas multimedia si estoy usando PlayPauseKeyDown. Todavía funciona si estoy usando PlayPauseKeyUp. – svintus