Obtenga una cadena de una colección de pulsaciones de teclas recuperadas utilizando API de entrada sin formato

Estoy usando la API Raw Input para obtener una colección de pulsaciones de teclas desde un teclado (en realidad, un lector de tarjetas de banda magnética que emula un teclado). Aquí hay un par de extractos de código para que pueda tener una idea de cómo obtengo las claves.

[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);

Al ejecutar el código, el lector de tarjetas emite la cadena%B40^TEST, pero en la colección MyKeys tengo los siguientes 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' }

Parecen una colección de pulsaciones de teclas reales duh!) y no la cadena que representan. El código clave 16 parece serCambi, entonces en el mapeo de teclado configurado actualmente del lector de tarjetas un%l carácter @ se produce usando Shift + 5, representado por {16, 53}. El siguiente carácter, mayúsculaB, es Shift + B o {16, 66}. Y así ocurre con el resto de los personajes.

Obviamente, simplemente envía estos achar (como lo estoy haciendo ahora) no es el camino a seguir. Entonces, mi pregunta es: ¿cómo puedo traducir esta serie de pulsaciones de teclas en la cadena que representan?

Respuestas a la pregunta(1)

Su respuesta a la pregunta