2011-09-01 1 views
3

Quelqu'un a-t-il eu de la chance en simulant une frappe de majuscule avec CGEventCreateKeyboardEvent sous OS X? Fondamentalement, j'ai essayé le caractère alphabétique et le caractère alphanumérique correct, mais Caps Lock. Heureusement, je voudrais simuler la frappe de Caps Lock pour activer/désactiver la LED. Je ne sais pas quel est le problème pour mon code de test. Quelqu'un at-il eu des expériences pour cela?Comment simuler une frappe de majuscule avec CGEventCreateKeyboardEvent dans OS X

#include <stdio.h> 
#include <ApplicationServices/ApplicationServices.h> 

main() 
{ 
    bool wasCapsLockDown = CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, 57); 
    if (wasCapsLockDown) 
     printf("On\n"); 
    else 
     printf("Off\n"); 
    ProcessSerialNumber psn; 
    GetFrontProcess(&psn); 
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);//CGEventSourceCreate(kCGEventSourceStateCombinedSessionState); 
    CGEventRef CapsLockDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)57, true); 
    //CGEventFlags modifiers = 0; 
    //modifiers |= kCGEventFlagMaskAlphaShift; 
    //CGEventSetFlags(CapsLockDown, modifiers); 
    CGEventRef CapsLockUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)57, false); 

    // simulate capslock down 
    CGEventPost(kCGHIDEventTap, CapsLockDown); 
    // simulate capslock up 
    CGEventPost(kCGHIDEventTap, CapsLockUp); 

    //CGEventPost(kCGAnnotatedSessionEventTap, CapsLockDown); /* doesn't work */ 
    //CGEventPost(kCGAnnotatedSessionEventTap, CapsLockUp); 

    //CGEventPost(kCGSessionEventTap, CapsLockDown); /* doesn't work */ 
    //CGEventPost(kCGSessionEventTap, CapsLockUp); 

    //CGEventPostToPSN(&psn, CapsLockDown); /* doesn't work */ 
    //CGEventPostToPSN(&psn, CapsLockUp); 

    CFRelease(CapsLockUp); 
    CFRelease(CapsLockDown); 
    CFRelease(source); 
} 

Compile avec commande ci-dessous

gcc test.c -framework ApplicationServices 
+0

Idem, http://stackoverflow.com/q/2334022/236738 – MacGeek

Répondre

1

Avez-vous besoin pour basculer réellement les bouchons état de verrouillage, ou est simplement tournant la LED marche/arrêt suffisante? Si c'est juste les LED, il y a quelques exemples de code à:

https://github.com/mikeash/mikeash.com-svn/blob/master/CPUFlash/keyboard_leds.c

Notez qu'il ne comporte pas CGEvent du tout - il utilise la magie IOKit au mess avec les LED du clavier directement.

+1

Fondamentalement, j'espère que je pourrais changer l'état de verrouillage des majuscules et allumer/éteindre la DEL ensemble. J'ai essayé votre code d'exemple. Mais j'ai trouvé un problème. Il est seulement vaild dans l'application qui appelle cet exemple de code. Lorsque je passe à une autre application, la DEL de verrouillage des majuscules devient asynchrone avec l'entrée au clavier. J'espère que je voudrais savoir si un moyen de mettre en œuvre cela dans osx. En tout cas, merci pour votre réponse à l'avance. –

0

Haha! Cela pourrait être un classique .. Votre code se termine parce qu'il était vraiment capable de faire quoi que ce soit du tout. Ajoutez quelques sleep(seconds) ici et là. Essayez également de mettre un petit délai (usleep(microseconds)) entre les événements bas et haut.

Questions connexes