Event-Taps: Unterschiedliche Ergebnisse mit CGEventPost, kCGSessionEventTap, kCGAnnotatedSessionEventTap, CGEventTapPostEvent

StackOverflow https://stackoverflow.com/questions/553284

Frage

Ich laufe in ein heikles Problem mit einem Ereignis von einem Ereignisse tippen veröffentlichen. Ich Klopfen für NSSystemDefined bei kCGHIDEventTap, dann mit einer neuen das Ereignis zu ersetzen. Das Problem, das ich in zu renne ist, dass je nachdem, wie ich das Ereignis zu veröffentlichen, wird es von einigen Anwendungen nur gesehen zu werden. Meine Testanwendungen sind Opera, Firefox, Quecksilber und Xcode. Hier sind die verschiedenen Techniken, die ich in meinem Fall tippen Rückruf versucht haben, mit den Ergebnissen. Ich erwarte eine Aktion (die „richtige Antwort“) aus jeder Anwendung; "System Beep" bedeutet das nichts-ist-Schranke zu diesem Schlüsselsystem Klang.

  1. Erstellen Sie ein neues Ereignis und schicken Sie es aus dem Rückruf. Opera: keine Antwort / System Signalton, Firefox: keine Antwort / System Signalton, Quecksilber: korrekte Antwort, Xcode: keine Antwort / System beep

  2. Erstellen Sie ein neues Ereignis, eine Anzeige zu kCGSessionEventTap mit CGEventPost, null zurück. Opera: keine Antwort / System Signalton, Firefox: keine Antwort / System Signalton, Quecksilber: korrekte Antwort, Xcode: keine Antwort / System beep

  3. Erstellen Sie ein neues Ereignis, eine Anzeige zu kCGAnnotatedSessionEventTap mit CGEventPost, null zurück. Opera: korrekte Antwort, Firefox: richtige Antwort, Quecksilber: keine Antwort / System Signalton, Xcode: keine Antwort / System beep

  4. Erstellen Sie ein neues Ereignis, eine Anzeige mit CGEventTapPostEvent, null zurück. Opera: keine Antwort / System Signalton, Firefox: keine Antwort / System Signalton, Quecksilber: korrekte Antwort, Xcode: keine Antwort / System beep

  5. Erstellen Sie ein neues Ereignis, eine Anzeige mit CGEventPost kCGSessionEventTap und neues Ereignis zurück. Opera: keine Antwort / System Signalton, Firefox: keine Antwort / System Signalton, Quecksilber: korrekte Antwort, Xcode: keine Antwort / System beep

  6. Erstellen Sie ein neues Ereignis, eine Anzeige mit CGEventPost kCGAnnotatedSessionEventTap und neues Ereignis zurück. Opera: richtige Antwort und System Piep, Firefox: richtige Antwort und System Piep, Quecksilber: richtige Antwort und System Signalton, Xcode: keine Antwort / Doppel-System Signalton

  7. ein neues Ereignis erstellen, einstellen mit CGEventTapPostEvent und neues Ereignis zurück. Opera: keine Antwort / System Signalton, Firefox: keine Antwort / System Signalton, Quecksilber: korrekte Antwort, Xcode: keine Antwort / System beep

(6) ist die beste, aber die Benutzer auf korrekte Antworten über das zusätzliche System Piep beschweren, die ich vermute, von der Doppelbuchung der Veranstaltung kommen. Ich bin nicht sicher von anderen Kombinationen zu versuchen, oder wo sonst zu suchen. Kann jemand eine Führung anbieten? Gibt es eine Möglichkeit, die Ergebnisse der beiden Rücksendung der Veranstaltung von meinem Rückruf und Buchung auf dem kommentierten Hahn zu bekommen, ohne beide zu tun?

Sorry für die lange Frage; Ich habe viel experimentiert worden zu tun.

Vielen Dank im Voraus


Update: Dies ist der Code, den ich das Ereignis tippen erstellen verwenden:

CFMachPortRef eventTap;
eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, 0,CGEventMaskBit(NX_SYSDEFINED) | (1 << kCGEventKeyDown) | (1 << kCGEventKeyUp), myCGEventCallback, (void *)hidEventQueue);
War es hilfreich?

Lösung

Ich glaube, ich dieses Problem behoben. Ich hatte mit +[NSEvent keyEventWithType:location:modifierFlags:timestamp:windowNumber:context:characters:charactersIgnoringModifiers:isARepeat:keyCode:] eine NSEvent erstellen, um dann die Veranstaltung -CGEvent zurück. Ich wechselte CGEventCreateKeyboardEvent, die Ereignisquelle aus dem ursprünglichen Ereignisse mit CGEventCreateSourceFromEvent erstellt, und das Ereignis aus dem Rückruf zurück. Alle meine Tests bestehen jetzt.

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