Überwachen des globalen Modifizierertastenzustands (in einer beliebigen Anwendung)

In meinem Cocoa-Projekt verwende ich Carbon-Code, um globale Schlüsselereignisse (Verknüpfungen) aus anderen Anwendungen zu verarbeiten. Zur Zeit habe ich akEventHotKeyReleased Ereignishandler und ich können erfolgreich Tastenkombinationen abrufen, wenn meine Anwendung nicht aktiv ist. Das löst eine Operation in meiner Anwendung aus.

Das Problem habe ich mit dem Verhalten vonkEventHotKeyReleased ist:

Sagen wir zum Beispiel, ich drücke die Tastenkombination Cmd-Shift-P. Sobald ich die "P" -Taste loslasse, wird das Hotkey-Ereignis ausgelöst.Ich muss in der Lage sein, das Ereignis auszulösen (oder manuell auszulösen), wennalles der Tasten sind nicht gedrückt (d. h. die Tasten Cmd und Shift werden ebenfalls losgelassen).

Es ist einfach, Hotkeys zu überwachen, aber ich habe nichts zum Überwachen einzelner Tastenanschläge gesehen. Wenn ich die Modifizierertastenzustände überwachen könnte, wäre ich im Geschäft.

Irgendwelche Tipps dazu?

Danke im Voraus!

AKTUALISIEREN:

Ich habe versucht mitkEventRawKeyUp undkEventRawKeyModifiersChanged aber währendkEventHotKeyReleased Diese beiden funktionieren nicht, obwohl ich sie genauso eingerichtet habe wiekEventHotKeyReleased.

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

DasglobalHotKeyHandler Methode ist gefragtkEventHotKeyReleased, aber nicht fürkEventRawKeyUp Aus irgendeinem Grund kann ich nicht verstehen. Hier ist was meineglobalHotKeyHandler Methode sieht so aus:

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

Gibt es einen zusätzlichen Anruf, den ich tätigen muss, oder etwas anderes, das ich vergessen habe?

NB: Auf den ersten Blick scheint es aber möglich zu sein, dass Access for Assistive Devices deaktiviert istes ist nicht. Also bin ich ziemlich ahnungslos.

UPDATE 2:

Ich habe ein bisschen nachgeforschtCGEventTap Leibowitzn schlug vor und ich kam mit diesem Setup:

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, verwende ichkCGEventKeyUp als maske für den eventtipp bekomme ich aber irgendwieMouse-Down-Ereignisse ??! ??

UPDATE 3:

Ok, vergiss das. Ich habe die Zeile in dem Dokument übersehen, in der angegeben wurde, dass CGEventMaskBit (kCGEventKeyUp) für diesen Parameter verwendet werden soll. Der richtige Aufruf lautet also:

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

Ich habe aber immer noch ein Problem: Änderungstasten lösen das kCGEventKeyUp nicht aus ...

UPDATE 4:

Ok, vergiss das nochmal ... Ich werde meine eigenen Fragen 5 Minuten nachdem ich sie heute gestellt habe beantworten müssen, huh!

Verwenden Sie zum Abfangen von ModifikatortastenkCGEventFlagsChanged:

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

Also im Wesentlichen habe ich die Tasten- und Modifikator-Tastenzustandserkennung zum Laufen gebracht, aberIch bin immer noch daran interessiert zu wissenWarum kEventRawKeyUp funktioniert nicht...

NB: Beachten Sie auch, dass ich mich auf Tiger entwickle, um möglichst viel Unterstützung für neue und ältere Versionen des Betriebssystems zu erhalten. CGEventTap ist nur 10.4+, daher verwende ich dies vorerst, aber eine abwärtskompatible Lösung wäre willkommen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage