Как мне использовать CGEventKeyboardSetUnicodeString с несколькими символами?
Я пытаюсь использовать события, чтобы создать программу для OS X, которая будет слушать идиш, набранный в транслитерации, и публиковать результаты в иврите. Я сделал очень короткую программу для проверки того, что мне нужно сделать: http://pastie.org/791398
Таким образом, программа успешно заменяет каждый набранный "q" на "w":
if(inputString[0] == 'q') { inputString[0] = 'w'; }
Но как опубликовать строку из более чем одного символа? Например, если кто-то введет "sh", вам, вероятно, придется опубликовать клавишу возврата (чтобы удалить символ, который был опубликован только для "s"), а затем опубликовать символ, соответствующий "sh". Тем не менее, этот код приводит только к выводу на задний план:
else if(inputString[0] == 'm') { inputString[0] = '\b'; inputString[1] = 'n'; }
Я прошу прощения, если это основные вопросы; Я прочитал всю документацию, которую смог найти, но, возможно, не все понял. Также возможно, что я иду по этому пути совершенно неправильно.
2 ответа
В идеале вы должны использовать метод ввода вместо программы с событиями, скорее всего, используя Input Method Kit, если вам не требуется поддержка до 10.5. Использование событий для этой цели является плохой идеей, потому что пользователь может изменять, где он / она печатает, с помощью мыши и клавиатуры. Таким образом, если пользователь введет "s" в одном текстовом поле, а затем "h" в другом, вы не сможете заметить разницу.
Тем не менее, вот прямой ответ на ваш вопрос.
Строка рассчитывается по длине, поэтому вы не можете просто указать входящую длину (1); второй символ будет игнорироваться. Однако большинству приложений также не нравится получать более одного символа за событие, поэтому они просто отбрасывают оставшиеся символы. (Терминал является заметным исключением.)
Поэтому вы можете просто опубликовать второе событие со вторым персонажем.
else if(inputString[0] == 'm') {
inputString[0] = 'n';
CGEventKeyboardSetUnicodeString(event, 1, inputString);
CGEventPost(kCGSessionEventTap, event);
inputString[0] = '\b';
}
В общем случае (имитация> 2 нажатий клавиш) вам нужно создать событие для каждого символа, который вы хотите вставить. Этот пост рассылки включает в себя простой пример.
Вот как я отправляю строку первому респонденту (приложение переднего плана)
// 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);