Frage

Ola Folks,

Wieder einmal möchte ich aus dem Pool von Wissen von Menschen SO mit geteilt trinken.

Ich habe eine kleine App für OSX geschrieben, die auf eine Anwendung Schlüsselereignisse sendet. Ich bin Targeting OSX 10.5.x und neuer. Es besteht jedoch das Problem, wenn ich für 10.6.x auch bauen. Alles funktioniert gut, außer wenn ich nur die Zusatztasten senden; Alt, Befehl, Steuerung und die Umschalttaste gedrückt.

Das Problem ist, dass auf den beiden MacBooks, die Ereignisse für die Zusatztasten erscheinen so schnell gelöscht werden, da die Tester den Cursor mit der Maus oder berühren Sie das Touchpad bewegen.

Auf einem Desktop mit XCode installiert ist, funktioniert alles einwandfrei. Genau wie es sein sollte. Auf zwei verschiedenen MacBooks, tritt das Problem auf. Der Desktop verfügt über eine Standard-101-Tasten-Tastatur und eine Maus mit mehreren Tasten angebracht.
Wenn eine Maus an die MacBooks verbunden ist, wird eine Zwei-Tasten-Maus mit Scroll-Rad verwendet. Allerdings besteht das Problem, wenn keine Peripheriegeräte angeschlossen sind und das Touchpad verwendet wird.

Was ich geschehen erwarten ist, dass der Modifier Key Ereignis an die Zielanwendung gesendet wird, bewegt der Benutzer den Cursor mit der Maus / Touchpad, drücken Sie die Tasten auf der Maus / Touchpad und / oder drücken Sie die Tasten auf der Tastatur mit dem Modifier Taste gedrückt Ereignis ‚aktiv‘. Dann, wenn sie der Schlüssel Veranstaltung für die Sondertaste beenden, gesendet wird.

Hier ist, wie ich Taste gedrückt Ereignisse sandte, die Shift-Taste für dieses Beispiel:

case ModKeyShiftDown:
    xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
    xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, true);
    CGEventSetFlags(xTheCommand, kCGEventFlagMaskAlternate);
    CGEventPost(kCGHIDEventTap, xTheCommand);
    //CGEventPost(kCGSessionEventTap, xTheCommand);
    //CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
    CFRelease(xTheCommand);
    CFRelease(xEventSource);
break;

Ich habe alle drei Flags verwendet für die Erstellung der Ereignisquelle (kCGEventSourceStatePrivate, kCGEventSourceStateCombinedSessionState und kCGEventSourceStateHIDSystemState).

Ich habe versucht, die Tastatur-Ereignis mit der Ereignisquelle erstellen sowie null als ersten Parameter.

Ich habe versucht, mit und ohne die entsprechenden Flaggen auf der Veranstaltung.

Ich habe verschiedene Kombinationen versucht, die Veranstaltung der Entsendung; kCGHIDEventTap, kCGSessionEventTap und kCGAnnotatedSessionEventTap.

Für die Vollständigkeit, hier ist, wie ich eine Veranstaltung für die Shift-Taste an:

case ModKeyShiftUp:
    xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
    xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, false);
    CGEventSetFlags(xTheCommand, 0);
    CGEventPost(kCGHIDEventTap, xTheCommand);
    //CGEventPost(kCGSessionEventTap, xTheCommand);
    //CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
    CFRelease(xTheCommand);
    CFRelease(xEventSource);
break;

Wenn die Tester eine Zusatztaste nach unten Ereignisse auslösen, können sie die Cursor Änderung sehen, wie erwartet. Dies lässt mich wissen, das Ereignis von der Zielanwendung verarbeitet wird. Doch sobald sie mit der Maus oder Touchpad berühren, wird der Cursor wechselt zurück zu einem Standard-Cursor und die Maus-Ereignisse verarbeitet werden, als ob keine Zusatztaste Ereignisse aktiv sind.

Ich möchte wissen, ob es ein Problem mit der Art, wie ich die Ereignisse schicke. Ich möchte auch wissen, ob es eine alternative Möglichkeit ist Modifier Wichtige Ereignisse zu senden, die funktionieren werden.

Sorry, wenn ich overtalked dies. Meine Entschuldigung ist, dass ich nur ein paar Stunden geschlafen. : P

Thanx

-isdi -

War es hilfreich?

Lösung

Ola,

Interessanterweise mit AXUIElementRef und AXUIElementPostKeyboardEvent scheinen zu arbeiten.

Für welchen Gründen auch immer, das Senden von Schlüsselereignisse der Zugänglichkeit Objekt und Methode oben löst das Problem für die Tester verwenden.

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