Frage

Also, ich habe eine Menge Zeit diese wirklich coole Tastatur Makro-Anwendung erstellen verschwendet. Es funktioniert großartig, das einzige Problem ist, dass nach ein paar Minuten, es funktioniert ganz aufhört. Es hört genannt werden, wenn ich eine Taste drücken.

Ich habe nicht in der Lage gewesen, es zu sperren, aber es dauert immer mindestens 30 Sekunden geschehen. Normalerweise dauert es mehrere Minuten lang nicht passieren. Ich werde bis dahin aus vielen Veranstaltungen abgefangen und gesendet. Die Anwendung läuft noch, wenn es passiert.

Hier ist ein Beispiel dafür, was ich zu hören tun

 -(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)
}

Und die Handler -

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;
}

Beachten Sie auch, dass, wenn ich Intercept ein Ereignis (und das CGEventCreate(NULL) zurück), Ich gebe in der Regel eine oder mehrere Tastendrücke meiner eigenen, mit dem folgenden Code. Beachten Sie, dass KEYCMDSignal usw. sind nur Verknüpfungen zu den normalen Konstanten.

 - (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);
}

Danke!

War es hilfreich?

Lösung

Es gibt einen Fehler in Snow Leopard ist, glaube ich, dass stoppt Ihre Zuhörer heraus etwas mal wenn.

In Ihrem keyDown Handler Prüfung für die folgende Art und nur wieder aktiviert die Hörer.

if (type == kCGEventTapDisabledByTimeout) {
    NSLog(@"Event Taps Disabled! Re-enabling");
            CGEventTapEnable(eventTap, true);
    return event;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top