我使用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控件,合成成功。希望这可以帮助。

09-25 15:35