Преобразование NSString в keyCode + модификаторы для AXUIElementPostKeyboardEvent - PullRequest
4 голосов
/ 09 февраля 2011

Редактировать: Оказывается, я был введен в заблуждение во время моих первых исследований API специальных возможностей.Когда я нашел защищенное текстовое поле в иерархии AX, я легко смог установить значение.Не знаю, что делать с этим вопросом, но я хотел обновить его для будущих пользователей.

Я работаю над кодом, который будет публиковать события клавиатуры в целевых приложениях с помощью API-интерфейсов Accessibility.До сих пор я был в состоянии написать тривиальное приложение, которое позволяет мне вводить строковое значение и затем публиковать события клавиатуры с этими кодами клавиш в целевом приложении.В действительности строки могут быть прочитаны из другого места.

Что я еще не смог выяснить, это как выяснить, следует ли и какие ключи модификаторов также публиковать.Например, когда я набираю Hello, world! в своем тестовом приложении, входные данные отправляются в другое приложение как hello, world1, потому что я еще не включаю клавиши-модификаторы для создания верхнего регистра H и восклицательного знака.Это усложняется вдвойне символами с несколькими нажатиями клавиш, такими как é или ü.При отправке é отправляется, например, необработанный e без акцента.

Есть ли простой метод, который я упускаю из виду, для распознавания модификаторов в сочетании с кодом ключа для создания определенной строки NSString или unichar?Если нет, есть ли у кого-нибудь предложение, как поступить?Пока что лучшее, что я придумал, - это вызвать UCKeyTranslate со всеми возможными комбинациями модификаторов, пока я не найду комбинацию, соответствующую unichar, которую я использую -[NSString characterAtIndex:] Я не уверен, что это масштабируемо или надежно, хотя, учитываяхарактер многократного нажатия некоторых символов, как указано выше.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Я нашел пример, который выполняет трюк , но он неполон: в любом случае это не будет общим решением ... как это может обрабатывать несколько раскладок клавиатуры?

Для этого существует устаревшая функция cgquartz: CGPostKeyboardEvent (не уверен, что можно передать только символ?), Все еще может использоваться (помечен как недокументированный с некоторым побочным эффектом, но ...) .

РЕДАКТИРОВАТЬ: UCKeyTranslate как способ создания словаря. Интересно а как ОС это делает? Лучший ответ должен быть где-то спрятан!

1 голос
/ 09 февраля 2011

Это, вероятно, не поможет. Но на всякий случай: действительно ли необходимо отправлять события клавиатуры? Потому что это будет очень сложно, если вам понадобится поддержка, скажем, Kotoeri.

Это просто - переопределить insertText: и doCommandBySelector: и отправить результаты последовательности клавиш, а не отдельные нажатия клавиш.

...