Domanda

Sto cercando di utilizzare evento rubinetti per creare un programma di OS X che ascolterà per Yiddish digitato in traslitterazione e inviare il risultato in caratteri ebraici. Ho fatto un breve programma per testare uno le cose che avrei dovuto fare: http://pastie.org/791398

Come è, il programma sostituisce con successo ogni digitato 'q' con 'w':

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

Ma come si fa a inviare una serie di più di un personaggio? Per esempio, se qualcuno scrive 'sh' che ci si presumibilmente dovuto inviare un backspace (per eliminare il carattere che è stato inviato per la 's' da solo) e poi inviare il personaggio che corrisponde a 'sh'. Tuttavia, questo si traduce in codice solo backspace viene inviato:

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

Mi scuso se queste sono domande di base; Ho letto tutta la documentazione che ho trovato, ma potrei non ho capito tutto. E 'anche possibile che sto andando su questo tutto nel modo sbagliato.

È stato utile?

Soluzione

Idealmente si dovrebbe utilizzare un metodo di input, invece di un programma con rubinetti di eventi, molto probabilmente utilizzando Kit Input Method se non è necessario per sostenere pre-10.5. Utilizzando i rubinetti di eventi per questo scopo è intrinsecamente una cattiva idea, perché l'utente può modificare dove lui / lei sta scrivendo con il mouse e la tastiera. Quindi, se l'utente ha digitato una "s" in un campo di testo seguita da una "h" in un altro, non si sarebbe in grado di capire la differenza.

Detto questo, ecco una risposta diretta alla sua domanda.

La stringa di lunghezza conteggiata, quindi non si può semplicemente fornire la lunghezza ingresso (1); il secondo carattere verrà ignorato. Tuttavia, la maggior parte delle applicazioni anche non piace per ottenere più di un singolo carattere per evento, quindi faranno solo scartare i caratteri rimanenti. (Terminal è una notevole eccezione.)

Che cosa si può fare è semplicemente inserire un secondo evento con il secondo carattere in esso.

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

Nel caso generale (simulando> 2 tasti premuti) avrete bisogno di creare un evento per ogni carattere che si desidera inserire. Questo post mailing list include un semplice esempio .

Altri suggerimenti

Questo è come io mando una stringa al primo risponditore (applicazione in primo piano)

// 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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top