Решение Itai Bar-Haim хорошее, но есть проблема с мертвыми ключами.
При первом вызове CodeToString (int scanCode) с кодом сканирования мертвого ключа код возврата ToUnicodeEx () равен -1, и ваш метод возвращает правильное значение.
Но при следующем вызове ToUnicodeEx () вернет 2. Строка результата будет содержать мертвый ключ перед ожидаемым результатом, за которым следуют данные нежелательной памяти.
Например, я вызываю ваш метод с помощью ^ (мертвый ключ), а затем с помощью $. Первый вызов возвращает ^ (приятно), но второй вызов возвращает ^ $ azertyui.
Вы должны сделать две вещи, чтобы исправить это:
1) Вы должны использовать абсолютное значение кода возврата ToUnicodeEx (), чтобы установить длину вашего StringBuilder. Таким образом, вы избегаете получать ненужные данные после символов.
2) Когда код возврата ToUnicodeEx () равен -1, вы должны взять первый символ вашего StringBuilder в качестве результата для вашего метода. Затем необходимо удалить мертвую клавишу из состояния клавиатуры: вызвать ToUnicodeEx () со скан-кодом клавиши пробела.
Другая проблема, с которой вы можете столкнуться: если состояние клавиатуры было изменено пользователем, который нажал мертвую клавишу перед вызовом ToUnicodeEx (), возвращаемая строка будет содержать символ мертвой клавиши перед ожидаемым значением. Обходной путь, который я нашел, - это вызвать ToUnicodeEx () со скан-кодом клавиши пробела перед фактическим вызовом.
Надеюсь, это поможет!