我使用SendInput和带按钮的面板为WinCE开发了一个自定义键盘。自定义键盘工作正常,我的WinForm中的文本框能够显示字符。
目前我正在尝试使用以下方法将Korean 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),但显然,合成的过程根本不起作用,我仍然试图找出哪个部分出错,但是,我希望有人能指出我正确的方向,任何帮助表示赞赏。感谢。
答案 0 :(得分:1)
我找到了解决我面临的问题的方法。问题不是来自上面的代码,而是来自我使用的控件。最初,我用textBox和按钮测试了我的自定义键盘。但是,每次单击按钮都会使焦点从textBox转移到按钮,以某种方式结束合成。
通过用pictureBox替换Button控件,合成成功。希望这会有所帮助。