Se muestran caracteres dobles al escribir caracteres especiales al registrar las pulsaciones de tecla en c #

Tengo una aplicación que registra lo que presiona el usuario, pero cuando presiono caracteres especiales como´ cona, Llegará, Yo obtengo´´a; Lo mismo cuando quiero conseguir.à, entonces me pongo``a, por lo que todos los caracteres especiales se escriben dos veces y luego el carácter normal se escribe después.

He buscado por siempre y no puedo encontrar nada realmente. Pero me he dado cuenta de que el problema está en elToAscii Método, sin que los caracteres se escriben correctamente.

public string GetString(IntPtr lParam, int vCode)
{
    try
    {
        bool shift = Keys.Shift == Control.ModifierKeys || Console.CapsLock;

        string value = ""; 

        KeyboardHookStruct MyKeyboardHookStruct = 
            (KeyboardHookStruct)Marshal.PtrToStructure(
                lParam, typeof(KeyboardHookStruct));

        byte[] keyState = new byte[256];
        byte[] inBuffer = new byte[2];

        DllClass.GetKeyboardState(keyState);

        var ascii=
            DllClass.ToAscii(
                MyKeyboardHookStruct.vkCode, 
                MyKeyboardHookStruct.scanCode, 
                keyState, inBuffer, MyKeyboardHookStruct.flags
                );

        if (ascii == 1)
        {
            char key = (char)inBuffer[0];

            if ((shift) && Char.IsLetter(key))
                key = Char.ToUpper(key);

            value = key.ToString();
        }

        return value;
    }
    catch (Exception)
    {
        return "";
    }
}

¿Me estoy perdiendo algo o haciendo algo mal? Todos los demás personajes funcionan perfectamente, pero son los caracteres especiales los que vienen como caracteres dobles.

EDITAR:

Tratando conToUnicode en lugar.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern int ToUnicode(
    uint virtualKey, uint scanCode, byte[] keyStates, 
    [MarshalAs(UnmanagedType.LPArray)] [Out] char[] chars, 
    int charMaxCount, uint flags);

public string GetString(IntPtr lParam, int vCode)
{
    try
    {
        bool shift = Keys.Shift == Control.ModifierKeys || Console.CapsLock;

        string value = ""; 

        KeyboardHookStruct MyKeyboardHookStruct = 
            (KeyboardHookStruct)Marshal.PtrToStructure(
                lParam, typeof(KeyboardHookStruct));

        byte[] keyState = new byte[256];
        byte[] inBuffer = new byte[2];

        char[] chars = new char[2];

        DllClass.GetKeyboardState(keyState);

        int val = 0;

        val = ToUnicode(
                (uint)MyKeyboardHookStruct.vkCode, 
                (uint)MyKeyboardHookStruct.scanCode, 
                keyState, chars, chars.Length, 0
                );

        val = ToUnicode(
                (uint)MyKeyboardHookStruct.vkCode, 
                (uint)MyKeyboardHookStruct.scanCode, 
                keyState, chars, chars.Length, 0
                );

        if (val == 1)
        {
            char key = (char)chars[0];

            if ((shift) && Char.IsLetter(key))
                key = Char.ToUpper(key);

            value = key.ToString();
        }

        return value;
    }
    catch (Exception)
    {
        return "";
    }
}

Alguien POR FAVOR, ayúdame, realmente necesito resolver esto=/.

EDITAR:

int val = -1;

if (IsDeadKey((uint)vCode))
{
    while (val == -1)
    {
        val = ToUnicode(
                (uint)MyKeyboardHookStruct.vkCode, 
                (uint)MyKeyboardHookStruct.scanCode, 
                keyState, chars, chars.Length, 0
                );
    }
}
else
    val = ToUnicode(
            (uint)MyKeyboardHookStruct.vkCode, 
            (uint)MyKeyboardHookStruct.scanCode, 
            keyState, chars, chars.Length, 0
            );

Así que ahora he intentado llamar alToAscii oToUnicode Un par de veces para eliminar al personaje real pero sin éxito. ¿Lo estoy haciendo mal?

Al igual que para ASCII, primera convocatoria de´ yo obtengo-1, así lo vuelvo a llamar, luego me sale1; y luego presiono comoa, Llegará, pero luego solo me salea. Lo mismo si usoToUnicode dos veces después de la otra, acabo dea en lugar deá, y así ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta