Wie kann ich den Unterschied zwischen einem Tastaturereignis, das von einem Benutzer angeklickt wurde, und einem generierten Tastaturereignis unterscheiden?

8

Ich habe einen Tastatur-Hook installiert:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

Grundsätzlich möchte ich die Tastaturabgriffe des Benutzers nehmen, die Eingabe essen und stattdessen meine eigene Eingabe veröffentlichen.

Wenn er also "g" tippt, möchte ich vielleicht "foo" in das Textfeld schreiben.

Ich schreibe in das Textfeld mit CGEventPost und CGEventSetUnicodeString wie hier gefunden: Ссылка

Das Problem ist, dass jedes meiner programmatisch eingegebenen Zeichen den Tastatur-Hook trifft. Also kann ich nicht return NULL im Tastatur-Hook blockieren, um die Benutzereingabe zu blockieren ... die auch alle Programmeingaben blockiert!

Ich habe sie auf der Windows-Seite in C # mit der 'injected' Flagge unterschieden, siehe meine Frage vor einem Jahr hier: Wie verwende ich Low-Level-8-Bit-Flags als Bedingung?

Suchen Sie nach etwas Ähnlichem in Objective-C.

    
cksubs 30.04.2011, 09:38
quelle

1 Antwort

6

Sehen Sie sich die Kommentare in CGEventSource.h an. Es ist ein wenig einfacher, die Informationen zusammenzustellen, als die Ereignisdienste zu verwenden Referenz Die lange, aber richtige, sieht Art und Weise um wie eine Ereignisquelle erstellen (die Speicher-Management-Regeln unterliegt, Sie müssen CFRelease es, wenn Sie fertig sind es vor Beendigung des Programms verwendet wird):

%Vor%

Dadurch wird Ihre eigene private Ereignisquelle mit einer eindeutigen ID erstellt. Sie geben dann an, dass von Ihnen erstellte Ereignisse von dort stammen:

%Vor%

Wenn ein Ereignis eintrifft, überprüfen Sie, ob es von Ihnen selbst stammt:

%Vor%

Es gibt auch eine Benutzerdatenfeld für die Quelle, mit der Sie beliebige 64 Bit weitergeben können, falls erforderlich.

Der schnellste und schmutzigste Weg wäre, ein Ereignisfeld auszuwählen, das wahrscheinlich kein sinnvoller Wert für ein Tastaturereignis ist, wie kCGMouseEventPressure , und es in eine Signatur umzuwandeln:

%Vor%     
Josh Caswell 30.04.2011, 18:48
quelle