如何在Winform中输入韩语?
How to take Korean input in Winform?
我想在 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;
首先检查语言是韩语还是其他语言,所以如果是韩语,你必须不同地处理它。
你必须得到开始和结束组成的信息,你必须经常检查它是否是字符或组成的延续。将 mIsImeProcessed
设置为 true
并将 mIsImeContinue
设置为 false
一旦您在 WndProc
.
中获得合成结束
我们也需要处理退格键的大小写。
我想在 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;
首先检查语言是韩语还是其他语言,所以如果是韩语,你必须不同地处理它。
你必须得到开始和结束组成的信息,你必须经常检查它是否是字符或组成的延续。将 mIsImeProcessed
设置为 true
并将 mIsImeContinue
设置为 false
一旦您在 WndProc
.
我们也需要处理退格键的大小写。