我使用SendInput和带有按钮的面板为WinCE开发了自定义键盘。自定义键盘工作正常,并且WinForm中的文本框能够显示字符。
目前,我正在尝试使用以下方法在自定义键盘中实现韩文IME:
// Subclass to capture Windows messages, passing the handle of the TextBox
_newproc = new WndProcDelegate(MyWndProc);
_oldproc = GetWindowLong(textBox1.Handle, -4);
result = SetWindowLong(textBox1.Handle, -4, Marshal.GetFunctionPointerForDelegate(_newproc));
// Capture the WM_IME_COMPOSITION message to get the composite character
public IntPtr MyWndProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
{
switch (msg)
{
case WM_IME_COMPOSITION:
{
int comp = lParam.ToInt32();
int intdwSize = 0;
if ((comp & GCS_RESULTSTR) > 0)
{
IntPtr intICHwnd = IntPtr.Zero;
intICHwnd = ImmGetContext(hWnd);
intdwSize = ImmGetCompositionString(intICHwnd, GCS_RESULTSTR, 0, 0);
if (intdwSize != 0)
{
StringBuilder s = new StringBuilder(intdwSize + 1);
intdwSize = ImmGetCompositionString(intICHwnd, GCS_RESULTSTR, s, intdwSize);
textBox1.Text = s.ToString();
}
ImmReleaseContext(hWnd
, intICHwnd);
}
else if ((comp & GCS_COMPSTR) > 0)
{
IntPtr intICHwnd = IntPtr.Zero;
intICHwnd = ImmGetContext(hWnd);
intdwSize = ImmGetCompositionString(intICHwnd, GCS_COMPSTR, 0, 0);
if (intdwSize != 0)
{
StringBuilder s = new StringBuilder(intdwSize);
intdwSize = ImmGetCompositionString(intICHwnd, GCS_COMPSTR, s, intdwSize);
// Trying to display the composite character in the textbox
textBox1.Text = s.ToString();
}
ImmReleaseContext(hWnd, intICHwnd);
}
}
break;
default:
break;
}
return CallWindowProc(_oldproc, hWnd, msg, wParam, lParam);
}
我设法捕获了特定的Windows消息(WM_IME_COMPOSITION),但显然,编写过程根本无法正常工作,尽管如此,我仍然试图找出哪一部分出错了,但是,我希望有人可以指出正确的方向,任何帮助表示赞赏。谢谢。
最佳答案
我找到了解决我所面临问题的方法。问题不在于上面的代码,而是我使用的控件。最初,我使用textBox和按钮测试了自定义键盘。但是,每次单击按钮都会导致焦点从文本框转移到按钮,从而以某种方式结束合成。
通过用pictureBox替换Button控件,合成成功。希望这可以帮助。