Obter uma String de uma coleção de pressionamentos de teclas recuperadas usando a API de entrada bruta

Estou usando a API de entrada bruta para obter uma coleção de pressionamentos de tecla em um teclado (na verdade, um leitor de cartão de tarja magnética que emula um teclado). Aqui estão alguns trechos de código para que você possa ter uma idéia de como estou obtendo as chave

[StructLayout(LayoutKind.Sequential)]
internal struct RAWKEYBOARD
{
    [MarshalAs(UnmanagedType.U2)]
    public ushort MakeCode;
    [MarshalAs(UnmanagedType.U2)]
    public ushort Flags;
    [MarshalAs(UnmanagedType.U2)]
    public ushort Reserved;
    [MarshalAs(UnmanagedType.U2)]
    public ushort VKey;
    [MarshalAs(UnmanagedType.U4)]
    public uint Message;
    [MarshalAs(UnmanagedType.U4)]
    public uint ExtraInformation;
}

[StructLayout(LayoutKind.Explicit)]
internal struct RAWINPUT
{
    [FieldOffset(0)]
    public RAWINPUTHEADER header;
    [FieldOffset(16)]
    public RAWMOUSE mouse;
    [FieldOffset(16)]
    public RAWKEYBOARD keyboard;
    [FieldOffset(16)]
    public RAWHID hid;
}

Queue<char> MyKeys = new Queue<char>();

// buffer has the result of a GetRawInputData() call
RAWINPUT raw = (RAWINPUT)Marshal.PtrToStructure(buffer, typeof(RAWINPUT));
MyKeys.Enqueue((char)raw.keyboard.VKey);

Ao executar o código, o leitor de cartão gera a string%B40^TEST, mas na coleção MyKeys, tenho os seguintes valores:

{ 16 '',  53 '5', 16 '', 66 'B',
  52 '4', 48 '0', 16 '', 54 '6',
  16 '',  84 'T', 16 '', 69 'E',
  16 '',  83 'S', 16 '', 84 'T' }

Estas parecem ser uma coleção de pressionamentos de teclas reais duh!) e não a string que eles representam. O código-chave 16 parece serMudanç, portanto, no teclado atualmente configurado pelo leitor de cartões, mapeando um% caractere @ é produzido usando Shift + 5, representado por {16, 53}. O caractere a seguir, maiúsculoB, é Shift + B ou {16, 66}. E assim vale para os demais personagens.

Obviamente, basta convertê-los parachar (como estou fazendo agora) não é o caminho a seguir. Portanto, minha pergunta é: como posso traduzir esse conjunto de teclas pressionadas na String que elas representam?

questionAnswers(1)

yourAnswerToTheQuestion