winforms 如何在Winform中进行韩文输入?

daupos2t  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(149)

我想在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
我已经观察到,它类型的第一个字符正确。例如,(韩国字符)在键入第二个字符。(第一个字符,第二个字符,第一个字符)。

cotxawn7

cotxawn71#

我已经设法解决了这个问题,我写在这里是为了帮助别人。请让我知道,如果有任何错误的代码。

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,将mIsImeContinue设置为false
我们也需要处理退格键的情况。

相关问题