C# 如何在Winform中接受韩语输入?

C# 如何在Winform中接受韩语输入?,c#,winforms,ime,C#,Winforms,Ime,我想在winform应用程序的可编辑区域中键入韩文文本 但是字符在重复,我试图覆盖默认的WndProc,但没有任何效果 switch (m.WParam.ToInt32()) { case Common.Interop.Window.WM_IME_CHAR: break; case Common.Interop.Window.WM_IME_ENDCOMPOSITION:

我想在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\u CHAR
,但当我用韩语输入时,断点会在第一个字符上点击
WM\u IME\u COMPOSITION
,然后在第一个字符后点击
WM\u IME\u COMPOSITION

我注意到它键入的第一个字符是正确的。 例如ㅁ (韩文) 输入第二个字符。 ㅁㅂㅁ (第一个字符,第二个字符,第一个字符)。
我想要记事本上的行为,我已经设法解决了这个问题,我在这里写作是为了帮助别人。 如果代码中有任何错误,请告诉我

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; 
首先检查语言是韩语还是其他语言,所以如果是韩语,你必须以不同的方式处理

你必须得到开始和结束构图的信息,你必须经常检查它是字符的延续还是构图的延续。在
WndProc
中获得合成结束后,将
mIsImeProcessed
设置为
true
,并将
misimecotinue
设置为
false


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

也显示switch语句。此链接可能会对您有所帮助。这是什么样的控制?标准的
文本框
?它是子类化的吗?因为否则它应该工作得很好。记事本中的文本区域也基于一个普通的编辑控件,默认情况下,它连接了所有需要输入法的内容。WPF将是一个不同的故事,但不是WinForms。控件基本上是一个第三方控件,他们没有处理它,我必须从windows端代码处理它。我正在将c#code中的输入字符传递给Vincent McNabb答案(第三条评论中的链接)下方发布的第三方dllyou,这有帮助,是否意味着这个问题可以结束?