如何在Winform中输入韩语?

How to take Korean input in 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.

我观察到它输入的第一个字符是正确的。 例如ㅁ (韩文) 在输入第二个字符时。 ㅁㅂㅁ(第一个字符,第二个字符,第一个字符)。 我想要记事本中的行为

我已经以某种方式解决了这个问题,我写在这里是为了帮助别人。 如果代码中有任何错误,请告诉我。

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.

中获得合成结束

我们也需要处理退格键的大小写。