在WinCE中使用韩文IME的自定义键盘

时间:2014-07-17 03:05:53

标签: c# keyboard compact-framework windows-ce virtual-keyboard

我使用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),但显然,合成的过程根本不起作用,我仍然试图找出哪个部分出错,但是,我希望有人能指出我正确的方向,任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:1)

我找到了解决我面临的问题的方法。问题不是来自上面的代码,而是来自我使用的控件。最初,我用textBox和按钮测试了我的自定义键盘。但是,每次单击按钮都会使焦点从textBox转移到按钮,以某种方式结束合成。

通过用pictureBox替换Button控件,合成成功。希望这会有所帮助。