2010-06-01 4 views
1

Je suis en train d'enregistrer des événements clés en utilisant ce code mondial:Problème avec CGEventTapCreate() appelez

void function() 
{ 
    CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL); 


CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0); 
    CFRelease(keyUpEventTap); 

    CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode); 
    CFRelease(keyUpRunLoopSourceRef); 
} 

l'application se bloque lors de l'exécution appel CFMachPortCreateRunLoopSource(). Je pense que le crash est dû à CGEventMaskBit (kCGEventKeyUp) lorsque je crée un événement tap.

Mais si je crée un événement tap en utilisant CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&keyUpCallback,NULL), l'application fonctionne bien. Ça ne plante pas. Je reçois des rappels quand une touche de modification est enfoncée. Mais je dois obtenir des rappels pour la touche de suppression appuyée.

Des idées?

Merci,

Dheeraj.

+0

Avez-vous essayé de regarder pour des événements clés en bas? – JWWalker

+0

oui j'ai essayé aussi pour les événements clés. Les deux claviers en haut et en bas. – Dheeraj

Répondre

5

Je pense que vous avez besoin d'une autorisation spéciale pour vous inscrire aux événements de clavier. J'oublie de la main ce que c'est, mais pour le tester, exécutez le programme en tant que root et voyez s'il se bloque toujours.

Edit:

Selon this article vous devez exécuter le programme en tant que root ou permettre à des appareils fonctionnels.

Le plantage est peut-être dû au fait que CGEventTapCreate renvoie NULL.

+0

Un grand merci pour la réponse. Oui le CGEventTapCreate retourné est null quand je passe CGEventMaskBit (kCGEventKeyUp) comme argument mais fonctionne bien avec CGEventMaskBit (kCGEventFlagsChanged) comme argument. Si cela est lié au processus s'exécutant en tant que root, alors les deux options devraient retourner NULL à droite? Corrigez-moi si j'ai tort, s'il-vous plait. Quel pourrait être le problème? – Dheeraj

+0

Seuls les événements d'incrémentation et d'effacement de touche nécessitent une autorisation spéciale. Les événements de la souris et de la touche de modification ne sont pas protégés. – drawnonward

+0

C'est une question de sécurité. Les enregistreurs de frappe sont intéressés par les caractères tapés, ce qui nécessite des autorisations plus élevées, ce qui vous permet de savoir quand une application vous keylogs. L'option ou les touches Maj enfoncées d'un mot de passe contiennent relativement peu d'informations. – uliwitness

Questions connexes