Frage

Ich verwende einig Carbon-Code in meinem Kakao-Projekt für globale Schlüsselereignisse (Shortcuts) aus anderen Anwendungen Handhabung. Zur Zeit habe ich Setup einen kEventHotKeyReleased Event-Handler und ich kann erfolgreich Hot-Keys erhalten, wenn meine Anwendung nicht aktiv ist. Das löst eine Operation in meiner Anwendung.

Das Problem, das ich mit dem Verhalten von kEventHotKeyReleased habe, ist:

Nehmen wir zum Beispiel drücke ich die Cmd-Shift-P-Tastenkombination. Sobald ich die Taste „P“ das Hotkey-Ereignis ausgelöst wird freigeben. Ich brauche das Ereignis auslösen können (oder manuell auslösen), wenn alle der Schlüssel unpressed sind (dh: die Cmd und Shift zu Tasten sind freigegeben) <. / p>

Es ist einfach für Hot-Keys zu überwachen, aber ich habe nichts für die Überwachung der einzelnen Tastenanschläge gesehen. Wenn ich die Zusatztaste Zustände überwachen kann ich im Geschäft sein würde.

Für Hinweise, wie dies zu tun?

Vielen Dank im Voraus!


UPDATE:

Ich habe versucht, mit kEventRawKeyUp und kEventRawKeyModifiersChanged aber während kEventHotKeyReleased funktioniert die beiden nicht, obwohl ich setzte sie in genau der gleichen Art und Weise wie oben kEventHotKeyReleased.

EventTypeSpec eventTypes[] = {{kEventClassKeyboard, kEventHotKeyReleased}, {kEventClassKeyboard, kEventRawKeyUp}};
// Changing the order in the list does not help, nor does removing kEventHotKeyReleased
OSStatus err = InstallApplicationEventHandler(&globalHotkeyHandler, GetEventTypeCount(eventTypes), eventTypes, NULL, NULL);
// err == noErr after this line

Die globalHotKeyHandler Methode wird für kEventHotKeyReleased genannt, aber nicht für kEventRawKeyUp aus irgendeinem Grund kann ich nicht zu begreifen scheinen. Hier ist, was meine globalHotKeyHandler Methode wie folgt aussieht:

OSStatus globalHotkeyHandler(EventHandlerCallRef nextHandler, EventRef anEvent, void *userData) {
    NSLog(@"Something happened!");
}

Gibt es einen zusätzlichen Anruf, die gemacht werden muss oder etwas anderes habe ich vergessen?

N. B: Auf den ersten Blick scheint es, wie es, dass Zugriff für Hilfsgeräte sein könnte, ist deaktiviert, aber es ist nicht . Also ich bin ziemlich ratlos.


UPDATE 2:

suchte ich ein bisschen auf dem CGEventTap Leibowitzn vorgeschlagen und ich kam mit dieser Einrichtung auf:

CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,kCGEventKeyUp,&keyUpCallback,NULL);
CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0);
CFRelease(keyUpEventTap);
CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode);
CFRelease(keyUpRunLoopSourceRef);

... und der Rückruf:

CGEventRef keyUpCallback (CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
    NSLog(@"KeyUp event tapped!");
    return event;
}

Wie Sie sehen, ich bin mit kCGEventKeyUp als Maske für die Antippereignis aber irgendwie Ich erhalte Maus nach unten Ereignisse ??! ??


UPDATE 3:

Ok vergessen, übersah ich die Zeile in dem doc, dass der CGEventMaskBit (kCGEventKeyUp) für diesen Parameter zu verwenden, so dass der korrekte Aufruf lautet:

CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL);

Ich habe immer noch ein Problem, aber: Zusatztasten können die kCGEventKeyUp nicht auslösen ...


UPDATE 4:

Ok vergessen, dass wieder ... Ich bin auf meine eigenen Fragen 5 Minuten zu beantworten gebunden, nachdem sie heute fragen, huh!

Um abfangen Zusatztasten, Verwendung kCGEventFlagsChanged:

CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&callbackFunction,NULL);

Also im Grunde habe ich den Schlüssel und Zusatztaste Zustandserkennung arbeiten, aber Ich habe Interesse noch zu wissen, Warum kEventRawKeyUp funktioniert nicht ...


NB: Beachten Sie auch, dass ich auf Tiger mit dem Ziel bin Entwicklung Unterstützung, die für neue und ältere Versionen des Betriebssystems so viel wie möglich. CGEventTap ist 10.4+ nur so werde ich dies jetzt verwenden, sondern eine rückwärtskompatible Lösung wäre willkommen.

War es hilfreich?

Lösung

Eine Option ist EventTaps zu verwenden. Auf diese Weise können Sie alle Tastaturereignisse überwachen. Sehen: http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate

Leider stoppt Ereignis Taps arbeiten, wenn eine Anwendung eine sichere Eingabe anfordert. Zum Beispiel Quicken.

Andere Tipps

OSStatus err = InstallApplicationEventHandler(&globalHotkeyHandler, GetEventTypeCount(eventTypes), eventTypes, NULL, NULL);

Dies ist nicht global. Dies installiert die Prozedur nur, wenn die eigene Anwendung aktiv und (glaube ich) nach dem Carbon-Event Manager eigene Ereignisfilter.

Sie müssen InstallEventHandler verwenden, die ein Ereignisziel als ersten Parameter übernimmt (InstallApplicationEventHandler ist ein Makro, das die Anwendung Ereignisziel übergibt).

Für Ereignisse, die auftreten, während Ihre Anwendung nicht aktiv ist, ist das Ziel, das Sie wollen GetEventMonitorTarget(). Für Ereignisse, die während der Anwendung auftreten ist aktiv ist, das Ziel, das Sie wollen, ist GetEventDispatcherTarget(). Zu fangen Ereignisse unabhängig davon, welche Anwendung aktiv, installieren Sie Ihre Handler auf beiden Ziele.

Heute aber ich würde nur CGEventTaps verwenden, wie Leibowitzn vorgeschlagen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top