c# - 在 WinCE 中使用韩语 IME 的自定义键盘

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

我为 WinCE 开发了一个自定义键盘,使用 SendInput 和一个带按钮的面板。自定义键盘工作正常,我的 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),但显然,组合过程根本不起作用,我仍在尝试找出是哪一部分出了问题,不过,我希望有人能指出我正确的方向,任何帮助表示赞赏。谢谢。

最佳答案

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

将Button控件换成pictureBox,合成成功。希望这会有所帮助。

关于c# - 在 WinCE 中使用韩语 IME 的自定义键盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794224/

相关文章:

python - 如何在opengl和pygame中用键盘按键移动立方体?

c# - OpenFileDialog 不浏览.NET CF 下的文件夹

c# - SignalR Client 是否在 .NET Compact Framework 上运行?

c# - .NET MVC 身份验证 - 表单 + Windows 身份验证

reactjs - 问题 : React-Native - Keyboard closes on each keystroke for TextInput

c# - 机器重启后注册表项不存在

Java Applet 游戏设计 : Keyboard focus

compact-framework - db4o 在紧凑框架上的任何竞争对手?

c# - 如何在 WP 8.1 中为超链接按钮添加下划线

c# - 预购通用列表 C#