Преобразование CGKeyCodes для международных клавиатур
В моем приложении мне нужно сопоставить ярлык с клавишей слева от клавиши "1" на клавиатуре. На стандартной клавиатуре США это будет символ обратного удара (" ` "), который является кодовым номером 50. К сожалению, международные клавиатуры (например, французская клавиатура) имеют другую клавишу слева от клавиши 1 (прямая косая черта "/"), поэтому жесткое кодирование этого кода клавиши может привести к неожиданным результатам для пользователей, не использующих клавиатуру США.
Есть ли способ преобразовать код клавиши США в код клавиши для международных клавиатур во время выполнения или способ программно определить код клавиши, основываясь на положении клавиши на клавиатуре?
1 ответ
Символ на клавише слева от "1" отличается на разных раскладках клавиатуры, но код виртуальной клавиши должен быть одинаковым. Если вы посмотрите на HIToolbox/Events.h
, вы можете увидеть постоянную kVK_ANSI_Grave
, который представляет ключ, о котором вы говорите; выше списка констант есть комментарий, который предполагает, что на уровне кода виртуального ключа равенство означает, что физический ключ один и тот же, хотя код сканирования может отличаться, а излучаемая буква может отличаться.
Другими словами: драйвер клавиатуры сопоставляет коды сканирования с кодами виртуальных клавиш, а раскладка клавиатуры (которую вы можете изменить в Системных настройках) сопоставляет коды виртуальных клавиш с символами.
Это все потенциально неправильно; У меня нет неамериканской клавиатуры для проверки этих утверждений.