单击鼠标时,韩语虚拟键盘禁用WM_IME_ENDCOMPOSITION

时间:2012-02-21 15:33:16

标签: c# click ime virtual-keyboard

我正在处理与This Question完全相同的情况。

没有答案,问题太旧,所以如果OP找到了解决方案,我无法留下任何评论。

我刚刚学习p / invoke的基础知识,至少很难理解它。

我一直在做很多搜索。我发现This question将我与This question/answer联系起来,但仍然无法理解我需要做什么。

我想我想要一种方法来操纵WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITION。

提前谢谢

2 个答案:

答案 0 :(得分:1)

没有IME的专家,但你不能只是覆盖'WndProc'而不是传递“消息”,因为它阻止其他应用程序/控件处理它? WndProc捕获操作系统生成的数百个“Windows消息”,这些消息可以捕获到“正在监听的人”,一种方法是在条件合适时选择性地忽略该消息...

protected override void WndProc(ref Message m)
  {
    switch(m.Msg)
    {
      case WM_IME_ENDCOMPOSITION :
        // Gobble this up or ignore
        break;
      default:
        // Continue as normal
        base.WndProc (ref m);
        break;
    }
  }

例如,如果您正在处理Control,则可以覆盖控件的WndProc,捕获鼠标按下事件(或WM_MOUSEDOWN),设置变量以忽略WM_IME_ENDCOMPOSITION,然后在鼠标上重新启用该变量(或WM_MOUSEUP)?或者你可以使用MouseHook,但这可能有点过分......

答案 1 :(得分:0)

我最终做了什么,因为WM_IME_ENDCOMPOSITION显然没有被解雇, 我尝试禁用了mouseactivate winproc。

        private const int WM_MOUSEACTIVATE = 0x0021;
        private const int MA_NOACTIVATEANDEAT = 0x0004;

        protected override void WndProc(ref Message m)
        {
            if (mousestatus == 0)
            {
                if (m.Msg == WM_MOUSEACTIVATE)
                {
                    m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
                    return;
                }
                base.WndProc(ref m);
            }
        }

然后将我的所有面板点击事件处理程序更改为鼠标悬停事件。因为应用程序的某些部分确实需要单击,所以我添加了一个mousestatus变量,这样只有当mousestatus为0时才会禁用鼠标单击。这是由鼠标位置定义的(与禁用鼠标点击一样,我无法点击任何内容来启用它)。

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

    private void timer1_Tick(object sender, EventArgs e)
    {
        if ((Cursor.Position.X - Location.X) >= 904 && (Cursor.Position.X - Location.X) <= 963 && (Cursor.Position.Y - Location.Y) >= 145 && (Cursor.Position.Y - Location.Y) <= 167)
        {
            mousestatus = 1;

            mouse_event(MOUSEEVENTF_LEFTDOWN, Cursor.Position.X, Cursor.Position.Y, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, Cursor.Position.X, Cursor.Position.Y, 0, 0);


            timer4.Start();

        }
    }

我很确定点击会在mousestatus = 1定义之前发生,所以为了确保点击我需要的点,我点了一下虚拟鼠标。 timer4只是一个将mousestatus设置回0的计时器。

代码可能有点乱,我确信有一些我可以使用的快捷方式,但截至目前,它适用于我需要的东西。 = d