Question

Alors, je l'ai perdu un tas de temps à créer ce clavier vraiment cool l'application macro. Il fonctionne très bien, le seul problème est que, après quelques minutes, il arrête juste travail. Il cesse de s'appeler quand j'appuie sur une touche.

Je n'ai pas été en mesure de le verrouiller, mais il faut toujours au moins 30 secondes pour arriver. Habituellement, il ne se produira pas pendant plusieurs minutes. Je l'ai intercepté et envoyé de nombreux événements alors. L'application est toujours en cours quand il arrive.

Voici un exemple de ce que je fais écouter

 -(void)listen {

      CFMachPortRef downEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionDefault,CGEventMaskBit(kCGEventKeyDown),&onKeyDown,self);  
      downSourceRef = CFMachPortCreateRunLoopSource(NULL, downEventTap, 0);
      CFRelease(downEventTap);
      CFRunLoopAddSource(CFRunLoopGetCurrent(), downSourceRef, kCFRunLoopDefaultMode);
      CFRelease(downSourceRef)
}

Et le gestionnaire -

CGEventRef onKeyDown(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    NSLog(@"DOWN (%i)", CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)); 
    // When it matches, I return CGEventCreate(NULL) to stop the event
    return event;
}

Notez également que lorsque je intercepter un événement (et de retour qui CGEventCreate(NULL)), je publie généralement une ou plusieurs clés presses de mon propre, en utilisant le code suivant. Notez que KeyCmd, etc, sont des raccourcis seulement aux constantes normales.

 - (void)sendKey:(KeyCode)code cmd:(BOOL)cmd alt:(BOOL)alt ctl:(BOOL)ctl shift:(BOOL)shift {

    CGEventFlags flags = 0;

    if (cmd) flags = flags | KeyCmd;
    if (alt) flags = flags | KeyAlt;
    if (ctl) flags = flags | KeyCtl;
    if (shift) flags = flags | KeyShift;    

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef keyDownPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)code, YES);

    CGEventSetFlags(keyDownPress, flags);

    CGEventPost(kCGAnnotatedSessionEventTap, keyDownPress);

    CFRelease(keyDownPress);
    CFRelease(source);
}

Merci!

Était-ce utile?

La solution

Il y a un bogue dans Snow Leopard, je pense, qui arrête votre écoute si le temps de quelque chose.

Dans votre gestionnaire keyDown, pour vérifier le type suivant, et juste réactivez l'auditeur.

if (type == kCGEventTapDisabledByTimeout) {
    NSLog(@"Event Taps Disabled! Re-enabling");
            CGEventTapEnable(eventTap, true);
    return event;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top