【问题标题】:How to take Korean input in Winform?如何在 Winform 中输入韩语?
【发布时间】:2017-06-15 07:59:44
【问题描述】:

我想在 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

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

【问题讨论】:

  • 也显示 switch 语句。
  • 这个链接可能会对您有所帮助。 stackoverflow.com/questions/3287180/…
  • 是什么样的控件?一个标准的TextBox?它以某种方式被子类化了吗?因为否则它应该可以正常工作。记事本中的文本区域也是基于一个普通的 EDIT 控件,它默认连接了所有需要的 IME 内容。 WPF 将是另一回事,但 WinForms 则不然。
  • 控件基本上是第三方控件,他们没有处理,我必须从windows端代码处理。我正在将输入字符从 c# 代码传递给第三方 dll
  • 您在文森特麦克纳布的回答下方发布了它的帮助(第 3 条评论中的链接),这是否意味着这个问题可以关闭?

标签: c# winforms ime


【解决方案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 中获得了合成结束。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多