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

Я хочу напечатать корейский текст в моей области пищевого продукта внутри приложения 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,

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

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,

Нам нужно разобраться с делом и для возврата.

Другие вопросы по тегам