Estoy tratando de agregar un evento trampa para habilitar/deshabilitar evento desde mi panel táctil mágico. Pensé que esto sería sencillo, es decir, registrar un evento trampa y, cuando sea necesario, descartar el evento al devolver NULL
. La idea es usar el parche para una entrada de datos específica que consume mucho tiempo, las aplicaciones para ingresar los datos son de terceros, así que no puedo simplemente agregar el código para quererlo allí. Así que pensé en monitorear los eventos del sistema y luego enviar la entrada deseada a través de un grupo de CGEventCreateKeyboardEvent
s.Consumir eventos de mouse/trackpad OSX con un evento toque
El problema es que devolver nulo no parece descartar los eventos, un poco más de investigación sugiere que esto no está restringido a los que provienen del trackpad sino también a mi mouse usb predeterminado.
Mi código está por debajo. Con lo que está debajo espero no poder mover el mouse, si cambio (A) para usar kCGEventScrollWheel
o kCGEventLeftMouseDragged
, entonces el evento se consume, es decir, desplazamiento o arrastre hacia la izquierda no ocurren. ¿Esto significa que no todos los eventos pueden descartarse? Con suerte sólo estoy perdiendo algo obvio aquí
#define case_print(a) case a: printf("%s - %d\n",#a,a); break;
CGEventRef eventOccurred(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* refcon) {
int subType = CGEventGetIntegerValueField(event, kCGMouseEventSubtype);
if (type == NSEventTypeGesture || subType == NX_SUBTYPE_MOUSE_TOUCH) {
printf("touchpad\n");
switch(type) {
case_print(kCGEventNull)
case_print(kCGEventLeftMouseDown)
case_print(kCGEventLeftMouseUp)
case_print(kCGEventRightMouseDown)
case_print(kCGEventRightMouseUp)
case_print(kCGEventMouseMoved)
case_print(kCGEventLeftMouseDragged)
case_print(kCGEventRightMouseDragged)
case_print(kCGEventScrollWheel)
case_print(kCGEventOtherMouseDown)
case_print(kCGEventOtherMouseUp)
case_print(kCGEventOtherMouseDragged)
case_print(kCGEventTapDisabledByTimeout)
case_print(kCGEventTapDisabledByUserInput)
case_print(NSEventTypeGesture)
case_print(NSEventTypeMagnify)
case_print(NSEventTypeSwipe)
case_print(NSEventTypeRotate)
case_print(NSEventTypeBeginGesture)
case_print(NSEventTypeEndGesture)
default:
printf("default: %d\n",type);
break;
}
event = NULL;
} else {
if (type == kCGEventMouseMoved) { // (A)
printf("discarding mouse event");
event = NULL;
}
}
return event;
}
CFMachPortRef createEventTap() {
CGEventMask eventMask = NSAnyEventMask;
if (!AXAPIEnabled() && !AXIsProcessTrusted()) {
printf("axapi not enabled");
}
return CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
eventMask,
eventOccurred,
NULL);
}
int main (int argc, const char * argv[]) {
CFMachPortRef tap = createEventTap();
if (tap) {
CFRunLoopSourceRef rl = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), rl, kCFRunLoopCommonModes);
CGEventTapEnable(tap, true);
CFRunLoopRun();
printf("Tap created.\n");
sleep(-1);
} else {
printf("failed!\n");
}
return 0;
}
Nota: "axapi no está activado" no se emitirá aunque yo no creo que la opción de accesibilidad afecta a todo menos los eventos de teclado.
Por cierto, he visto algunas publicaciones similares sobre cómo obtener los eventos del panel táctil, simplemente no hay nada aplicable a descartarlos (aparte de devolver el nulo debería funcionar).
¿Por qué se marcó como la respuesta? ¿Pudiste detener el procesamiento de un evento de mouse? Puedo detener los eventos clave, pero no los movimientos del mouse ... – cksubs