Terminé escribiendo una aplicación personalizada para filtrar las pulsaciones de las teclas de expulsión. Utiliza un evento de toque para hacerlo. Aquí hay un ejemplo mínimamente funcional que demuestra cómo hacerlo:
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>
static CFMachPortRef machPortRef = NULL;
CGEventRef specialKeyEventTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type == kCGEventTapDisabledByTimeout) {
CGEventTapEnable(machPortRef, true);
return event;
}
uint64_t subtype = CGEventGetIntegerValueField(event, 99);
if (subtype == 8) {
static CGEventFlags allModifiers = (kCGEventFlagMaskShift | kCGEventFlagMaskControl | kCGEventFlagMaskAlternate | kCGEventFlagMaskCommand);
int keycode = ((CGEventGetIntegerValueField(event, 149) & 0xFFFF0000) >> 16);
CGEventFlags flags = CGEventGetFlags(event);
if (keycode == NX_KEYTYPE_EJECT && (flags & allModifiers) == 0) {
// filter eject key when no modifiers are pressed
return NULL;
}
}
return event;
}
int main()
{
CFRunLoopSourceRef eventSrc = NULL;
machPortRef = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, CGEventMaskBit(NX_SYSDEFINED), (CGEventTapCallBack)specialKeyEventTapCallback, NULL);
if (machPortRef == NULL) {
fprintf(stderr, "CGEventTapCreate failed!\n");
return 1;
}
eventSrc = CFMachPortCreateRunLoopSource(NULL, machPortRef, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), eventSrc, kCFRunLoopDefaultMode);
CFRunLoopRun();
CFRelease(machPortRef);
CFRelease(eventSrc);
}
2 votos
¿Estás usando un Mac Pro? No se me ocurre otro Mac con bandeja de CD que soporte Sierra.
0 votos
@JMY1000 De hecho lo soy
0 votos
¿Sacar la llave?