我想在一个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.
我已经观察到它的第一个字符正确.
例如ㅁ(韩文)
打字第二个字符
ㅁㅂㅁ(第一个字符,第二个字符,第一个字符).
我想要在记事本中的行为
解决方法
我以某种方式解决了这个问题,我在这里写信帮助别人.
如果代码中有任何错误,请通知我.
如果代码中有任何错误,请通知我.
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.
我们需要处理backspace的情况.