Как взять корейский вход в Winform?

Я хочу напечатать корейский текст в моей области ediatble внутри приложения winform.

Но символы повторяются, я пытался переопределить значение по умолчанию WndProc, но ничего не работает.

switch (m.WParam.ToInt32())
                {
case Common.Interop.Window.WM_IME_CHAR:
                break;

            case Common.Interop.Window.WM_IME_ENDCOMPOSITION:
                    PassCharToScreen(m);
                break;

            case Common.Interop.Window.WM_CHAR:
                    PassCharToScreen(m);
                break;

            case Common.Interop.Window.WM_IME_NOTIFY:
                break;
            case Common.Interop.Window.WM_IME_COMPOSITION:
                PassCharToScreen(m);
                break;
            case Common.Interop.Window.WM_IME_COMPOSITIONFULL:
                break;

Когда я набираю текст на английском языке, точка останова WM_CHAR, но когда я печатаю на корейском языке, он нажимает WM_IME_COMPOSITION на первый символ, а затем после первого символа сначала обращается к WM_IME_COMPOSITION, а затем попадает WM_CHAR.

Я заметил, что он набирает первый символ правильно. например ㅁ (корейский характер) При вводе второго символа. ㅁㅂㅁ (Первый char, второй char, первый char). Я хочу, чтобы поведение, как в блокноте

Ответ 1

Я как-то решил проблему, я пишу здесь, чтобы помочь другим. Пожалуйста, дайте мне знать, есть ли ошибка в коде.

private bool mIsImeProcessed = true;
private bool mIsImeContinue = false;

case WM_IME_COMPOSITION:
                {
                    if (mKoreanInput == true)
                    {
                        long lParam = m.LParam.ToInt64();
                        long wParam = m.WParam.ToInt64();
                        char c = (char)m.WParam;
                        if (lParam == 24600)
                        {
                            if (mIsImeProcessed)
                            {
                                mIsImeProcessed = false;
                                mIsImeContinue = false;
                                PassCharToThirdParty(m);
                            }
                            else
                            {
                                PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString());
                            }
                            mIsImeContinue = true;
                        }
                    }
                    else if (lParam == 2048)
                    {
                        if (mIsImeProcessed)
                        {
                        }
                        else
                        {
                            if (mIsImeContinue == true)
                            {

                                PassCharToThirdPartyWithBackSpace(((char)m.WParam).ToString());
                            }
                        }

                        mIsImeProcessed = true;

                    }
                    else
                    {
                            PassBackSpaceToThirdParty();
                    }
                }
                break;
case Common.Interop.Window.WM_IME_ENDCOMPOSITION:
                if (mKoreanInput == true)
                {
                    mIsImeProcessed = true;
                    mIsImeContinue = false;
                }
                break; 

Сначала проверьте, является ли язык корейским или другим языком, поэтому, если его корейский, вы должны обрабатывать его по-разному.

Вам нужно получить информацию о композиции "Начало и конец", и вы должны всегда проверять, будет ли она продолжением характера или композиции. Установите mIsImeProcessed на true и mIsImeContinue на false после того, как вы получите Конец композиции в WndProc.

Нам также нужно обрабатывать регистр для backspace.