Frage

Ich versuche, Event -Taps zu verwenden, um ein OS X -Programm zu erstellen, das auf Jiddish zuhört, das in der Transliteration eingegeben wurde, und das Ergebnis in hebräischen Zeichen zu veröffentlichen. Ich habe ein sehr kurzes Programm gemacht, um eine Dinge zu testen, die ich tun müsste: http://pastie.org/791398

Wie es ist, ersetzt das Programm erfolgreich jeden typisierten 'q' durch 'w':

if(inputString[0] == 'q') { inputString[0] = 'w'; }

Aber wie veröffentlicht man eine Reihe von mehr als einem Charakter? Wenn jemand beispielsweise "sh" eingibt, müssten Sie vermutlich einen Rückraum posten (um das Charakter zu löschen, der für "s" allein) veröffentlicht wurde, und dann den Charakter zu posten, der 'SH' entspricht. Dieser Code führt jedoch dazu, dass nur ein Rückraum veröffentlicht wird:

else if(inputString[0] == 'm') { inputString[0] = '\b'; inputString[1] = 'n'; }

Ich entschuldige mich, wenn dies grundlegende Fragen sind. Ich habe alle Dokumentationen gelesen, die ich finden konnte, aber ich hätte vielleicht nicht alles verstanden. Es ist auch möglich, dass ich das völlig falsch mache.

War es hilfreich?

Lösung

Idealerweise sollten Sie eine Eingabemethode anstelle eines Programms mit Ereignishackungen verwenden, die höchstwahrscheinlich verwendet werden Eingabemethode Kit Wenn Sie vor 10.5 nicht unterstützen müssen. Die Verwendung von Event -Taps für diesen Zweck ist von Natur aus eine schlechte Idee, da der Benutzer sich ändern kann, wo er/sie sowohl mit der Maus als auch mit der Tastatur tippt. Wenn der Benutzer also in einem Textfeld ein "s" eingeben würde, gefolgt von einem "H" in einem anderen, könnten Sie den Unterschied nicht erkennen.

Das heißt, hier ist eine direkte Antwort auf Ihre Frage.

Die Saite ist mit Länge befragt, sodass Sie nicht nur die eingehende Länge (1) bereitstellen können. Der zweite Charakter wird ignoriert. Die meisten Anwendungen möchten jedoch auch nicht mehr als einen einzelnen Charakter pro Ereignis erhalten, sodass sie nur die verbleibenden Charaktere verwerfen. (Terminal ist eine bemerkenswerte Ausnahme.)

Sie können also einfach ein zweites Ereignis mit dem zweiten Charakter darin veröffentlichen.

else if(inputString[0] == 'm') {
  inputString[0] = 'n';
  CGEventKeyboardSetUnicodeString(event, 1, inputString);
  CGEventPost(kCGSessionEventTap, event);
  inputString[0] = '\b';
}

Im allgemeinen Fall (Simulation> 2 -Tastendresses) müssen Sie ein Ereignis für jedes Zeichen erstellen, das Sie einfügen möchten. Dieser Postlistenbeitrag Enthält ein einfaches Beispiel.

Andere Tipps

So sende ich eine Zeichenfolge an den Ersthelfer (Vordergrundanwendung)

// 1 - Get the string length in bytes.        
NSUInteger l = [string lengthOfBytesUsingEncoding:NSUTF16StringEncoding];

// 2 - Get bytes for unicode characters
UniChar *uc = malloc(l);
[string getBytes:uc maxLength:l usedLength:NULL encoding:NSUTF16StringEncoding options:0 range:NSMakeRange(0, l) remainingRange:NULL];

// 3 - create an empty tap event, and set unicode string
CGEventRef tap = CGEventCreateKeyboardEvent(NULL,0, YES);
CGEventKeyboardSetUnicodeString(tap, string.length, uc);

// 4 - Send event and tear down
CGEventPost(kCGSessionEventTap, tap);
CFRelease(tap);
free(uc);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top