такой функции со всеми вашими особенностями не существует.Вы должны построить таблицу соответствия.
простой способ - создать первый массив или таблицу enum с 256 виртуальными кодами клавиш или кодами сканирования, а второй массив дает вам правильный перевод virtualKey или кода сканирования в строковый ключ
например
public enum Key
{
Escape = 1,
D1,
D2,
D3,
D4,
D5,
D6,
D7,
D8,
D9,
D0
}
private string[] stringCodeMap = {
"", //key = 0,
"", //key = 1,
"1", //D1 = 2,
"2", //D2 = 3,
"3", //D3 = 4,
"4", //D4 = 5,
"5", //D5 = 6,
"6", //D6 = 7,
"7", //D7 = 8,
"8", //D8 = 9,
"9", //D9 = 10,
"0", //D0 = 11
}
и вы можете перехватить строковый код с помощью: если scankey является результатом нажатия клавиши (виртуальная клавиша или клавиша сканкода)
string skey = stringCodeMap[(int)scankey];
для нескольких нажатых клавиш, Управление, сдвиг (влево или вправо) .... имеют свой код