如何在Winform中获取韩文输入?

时间:2017-01-30 08:01:00

标签: c# winforms ime

我想在winform应用程序中的ediatble区域中键入韩语文本。

但是人物正在重复,我试图覆盖默认的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 char,second char,first char)。 我想要记事本中的行为

1 个答案:

答案 0 :(得分:0)

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

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

我们也需要处理退格的情况。