我想在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
。
我观察到它输入的第一个字符是正确的。 例如ㅁ(韩国人) 在键入第二个字符。 ㅁㅂㅁ(First char,second char,first char)。 我想要记事本中的行为
答案 0 :(得分:0)
我已经以某种方式解决了这个问题,我写这里是为了帮助别人。 如果代码中有任何错误,请告诉我。
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
。
我们也需要处理退格的情况。