c# - 如何在Winform中输入韩文?

标签 c# .net winforms ime

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

首先检查语言是韩语还是其他语言,所以如果是韩语你必须不同地处理它。

您必须获取 Start 和 End 组合的信息,并且您必须始终检查它是否是字符或组合的延续。将 mIsImeProcessed 设置为 true 并将 mIsImeContinue 设置为 false 一旦你在 WndProc.

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

关于c# - 如何在Winform中输入韩文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41931211/

相关文章:

c# - 访问临时文件夹时,ASP.NET 无权访问请求的资源

C# Visual Studio Excel 加载项 : How can I detect Excel Office Theme Change?

C# 是否可以更改 ListView 中的 e.Label 值

winforms - 谁调用 Winforms 控件中的 On<something> 方法?

c# - 具有 ObservableCollection 和 INotifyPropertyChange 的 Json.Net 类层次结构被序列化但未反序列化

javascript - 如何在以ajax方式插入后刷新我的服务器控件?

c# - 将授权 header 添加到 Web 引用

c# - 向 DataGridView 行标题添加文本

c# - 使用 DataTable 的行属性创建 DataView

VB.net 把窗口放在前面