我想在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;
Run Code Online (Sandbox Code Playgroud)
当我输入英文时,断点命中WM_CHAR,但是当我输入韩文时,它会击中WM_IME_COMPOSITION第一个字符,然后在第一个字符后首先命中WM_IME_COMPOSITION然后点击WM_CHAR.
我观察到它键入了第一个字符正确.例如ㅁ(韩文字符)输入第二个字符.ㅁㅂㅁ(First char,second char,first 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;
Run Code Online (Sandbox Code Playgroud)
首先,检查该语言是韩语还是其他语言,因此如果是韩语,则必须以不同的方式处理。
您必须获取有关开始和结束构图的信息,并且必须始终检查它是字符还是构图的延续。一旦您在 中获得“合成结束”,请设置mIsImeProcessed 为true和mIsImeContinue到。falseWndProc
我们还需要处理退格键的情况。
| 归档时间: |
|
| 查看次数: |
603 次 |
| 最近记录: |