Получите символьный акцент в NSEvent

В Cocoa вы можете переопределить метод keyDown(event:NSEvent) в некоторых классах, чтобы получать уведомления, когда пользователь нажимает клавишу. В большинстве случаев событие будет содержать, среди прочего, код клавиши и нажатые символы. Однако, если вы нажмете ' или " на расширенной клавиатуре США, вы получите код клавиши, но не символ. Когда вы печатаете, скажем, в текстовом редакторе, вы получите соответствующий символ на оранжевом фоне, а затем, если вы наберете букву, если эта буква может быть акцентирована этим символом, вы получите букву с акцентом, например ò или öили ó.

Могу ли я как-то получить акцент с события или найти его где-то сразу после события?


person Ibolit    schedule 18.10.2015    source источник


Ответы (1)


Во-первых, такие ключи называются «мертвыми ключами». Они не создают символы сами по себе, они изменяют то, какие символы создаются последующими нажатиями клавиш.

Что касается вашего вопроса, для мертвого ключевого события не существует одного акцента. Мертвый ключ просто изменяет состояние внутреннего конечного автомата. В некоторых раскладках клавиатуры одна мертвая клавиша может иметь различные эффекты в зависимости от последующих клавиш. Например, с эстонской раскладкой клавиатуры Option-(клавиша слева от Backspace) устанавливает состояние мертвой клавиши, которое изменяет «a» на «ä», «i» на «ů», «z» на « ż", а от "ö" до "ő".

В любом случае, если вы хотите обрабатывать ключевые события вручную, вы должны использовать UCKeyTranslate(). Вам нужны данные раскладки клавиатуры 'uchr', которые вы можете получить с помощью TISCopyCurrentKeyboardLayoutInputSource() и вызова TISGetInputSourceProperty() с помощью клавиши kTISPropertyUnicodeKeyLayoutData.

Вам также нужен тип клавиатуры, который вы можете получить от CGEvent, на котором основана NSEvent. Позвоните CGEvent() на NSEvent, а затем позвоните на CGEventGetIntegerValueField() с ключом kCGKeyboardEventKeyboardType.

Вам также потребуется преобразовать значения Cocoa для ключей-модификаторов в событие в значения Carbon (комбинации shiftKey, cmdKey и т. д.), сдвинутые вправо на 8 бит.

Вам нужно будет отслеживать текущее состояние мертвого ключа. Первоначально вы установили его равным 0, а затем для каждого ключевого события вы позволяли UCKeyTranslate() обновлять его. Вы сбросите его на 0, когда фокус сместится на другой элемент управления или окно.

Если состояние мертвого ключа не равно нулю при возврате из UCKeyTranslate(), это значит, что ключ мертвый. UCKeyTranslate() также мог создавать персонажей. То есть нажатие клавиши может как создавать реальные символы, так и устанавливать состояние мертвой клавиши, которое будет изменять последующие нажатия клавиш.

Если вы хотите представить символ, представляющий состояние мертвой клавиши, вы должны обработать нажатие клавиши до UCKeyTranslate() во второй раз с состоянием мертвой клавиши и kUCKeyTranslateNoDeadKeysMask в параметрах. Я считаю, что именно так определяется «отмеченный» символ (показан оранжевым), хотя, как я сказал выше, этот символ не обязательно имеет какое-то конкретное отношение к тому, как состояние мертвой клавиши фактически повлияет на последующее нажатие клавиши. Вы также можете обработать ложное нажатие клавиши пробела, чтобы определить этот символ.

person Ken Thomases    schedule 18.10.2015
comment
Довольно подробный ответ, для понимания которого потребуется время. Большое спасибо. - person Ibolit; 19.10.2015