J'utilise Quartz CGEventTap pour tenter d'intercepter globalement les appuis sur les majuscules et les bloquer (pour les faire faire quelque chose d'utile à la place). Je détecte avec succès les presses de capslock, mais j'ai été jusqu'à présent incapable de les bloquer. Mon code (provenant de this stackoverflow réponse) est quelque chose comme ceci:Impossible de bloquer le verrouillage des majuscules avec CGEventTap
eventTap = CGEventTapCreate(kCGHIDEventTap,
kCGTailAppendEventTap,
kCGEventTapOptionDefault,
eventMask,
myCGEventCallback,
&oldFlags);
runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
CGEventTapEnable(eventTap, true);
CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef theEvent, void *refcon)
{
CGEventFlags *oldFlags = (CGEventFlags *)refcon;
switch (type)
{
case kCGEventFlagsChanged:
{
CGEventFlags newFlags = CGEventGetFlags(theEvent);
CGEventFlags changedFlags = *oldFlags^newFlags;
*oldFlags = newFlags;
if (changedFlags == 65536)
{
NSLog(@"Capslock pressed. Let's not return the event");
return NULL;
}
break;
}
default:
break;
}
NSLog(@"Different modifier than capslock. Returning the event");
return theEvent;
}
Si je comprends correctement le retour NULL devrait bloquer efficacement la propagation de keypress. En effet, il le fait également pour les événements "normal" de keyup et de downdown. Cependant, le verrouillage des majuscules change indépendamment. Des idées pourquoi c'est? Est-ce que je fais des hypothèses incorrectes? Et/ou comment puis-je faire les choses différemment pour atteindre mon objectif?
Merci,
Thor
Merci pour votre réponse complète. –
Je sais que je suis un peu en retard, mais avez-vous réussi à basculer le verrouillage des majuscules? – sidyll
@sidyll: Il semble que vous ne pouvez pas faire cela. Pas même via une API privée.Vous pouvez utiliser une API privée pour que le système remappe le verrouillage des majuscules à une autre clé du pilote, mais aucune touche n'est possible (Apple en expose certaines dans les touches de modification du clavier prefs->, mais d'autres mappages sont possibles). . Si vous avez vraiment besoin d'un contrôle total de cette clé, vous devez écrire une propre extension de noyau; Vous pouvez utiliser ce projet open source comme une bonne référence comment en démarrer un: http://tinyurl.com/ykywauk – Mecki