Podwójne znaki wyświetlane podczas wpisywania znaków specjalnych podczas rejestrowania naciśnięć klawiszy w c #

Mam aplikację, która rejestruje wszystko, co użytkownik naciska, ale gdy naciskam znaki specjalne, takie jak´ za, aby dostaćá, Dostaję´´a; to samo, kiedy chcę się dostaćà, wtedy dostaję``a, więc wszystkie znaki specjalne są wpisywane dwa razy, a następnie zwykła postać zostaje wpisana po.

Szukałem na zawsze i nic nie mogę znaleźć. Ale zauważyłem, że problem tkwi wToAscii metoda, bez której znaki są wpisywane poprawnie.

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 "";
    }
}

Czy coś mi brakuje lub robię coś źle? Wszystkie inne postacie działają doskonale, ale to znaki specjalne przychodzą jako podwójne znaki.

EDYTOWAĆ:

Próbuję zToUnicode zamiast.

[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 "";
    }
}

Ktoś PROSZĘ mi pomóc, naprawdę muszę to rozgryźć=/.

EDYTOWAĆ:

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

Więc teraz próbowałem zadzwonić doToAscii lubToUnicode kilka razy, aby opróżnić prawdziwą postać, ale bez powodzenia. Czy robię to źle?

Jak w ASCII, pierwsze wezwanie´ dostaję-1, więc nazywam to ponownie, a potem dostaję1; a potem naciskam jaka, aby dostaćá, ale wtedy tylko dostajęa. To samo, jeśli używamToUnicode dwa razy po sobie, dostaję po prostua zamiastá, i tak dalej ...

questionAnswers(2)

yourAnswerToTheQuestion