C# 韩国虚拟键盘在鼠标单击时禁用WM_IME_ENDCOMPOSITION

C# 韩国虚拟键盘在鼠标单击时禁用WM_IME_ENDCOMPOSITION,c#,click,ime,virtual-keyboard,C#,Click,Ime,Virtual Keyboard,我所处理的情况和你的完全一样 没有答案,问题也太老了,所以我不能留下任何评论,看看OP是否找到了解决方案 我刚刚学习了p/invoke的基础知识,但至少不太理解它 我已经做了相当多的搜索。我找到了我的联系,但仍然无法理解我需要做什么 我想我是在寻求一种方法来操作WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITION 提前感谢您IME方面没有专家,但您不能只覆盖“WndProc”而不传递“消息”,因为它会阻止其他应用程序/控件处理它吗?WndProc捕获操作系统生成的

我所处理的情况和你的完全一样

没有答案,问题也太老了,所以我不能留下任何评论,看看OP是否找到了解决方案

我刚刚学习了p/invoke的基础知识,但至少不太理解它

我已经做了相当多的搜索。我找到了我的联系,但仍然无法理解我需要做什么

我想我是在寻求一种方法来操作WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITION


提前感谢您

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;
    }
  }

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

没有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;
    }
  }

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

我最后做的事情,因为WM\u IME\u 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”)]
公共静态外部无效鼠标事件(intdwflags、intdx、intdy、intcbuttons、intdwextrainfo);
私有无效计时器1_刻度(对象发送方,事件参数e)
{

如果((Cursor.Position.X-Location.X)>=904&&&(Cursor.Position.X-Location.X)=145&&(Cursor.Position.Y-Location.Y)我最后做了什么,因为WM\u IME\u 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”)]
公共静态外部无效鼠标事件(intdwflags、intdx、intdy、intcbuttons、intdwextrainfo);
私有无效计时器1_刻度(对象发送方,事件参数e)
{

如果((Cursor.Position.X-Location.X)>=904&&&(Cursor.Position.X-Location.X)=145&&(Cursor.Position.Y-Location.Y)可能与…重复,对不起,重复就是重复。“问题太老了”应该对添加评论的能力没有影响。我不想添加“答案”,因为它不是答案。没有链接“添加评论”,这是一条评论。可能重复…抱歉,重复就是重复。“问题太老”应该不会影响添加评论的能力。我不想添加“答案”,因为它不是答案。没有“添加评论”的链接"这就是它,一个注释。我想我可以做你解释的所有事情,除了设置一个变量来忽略WM_IME_ENDCOMPOSITION。好吧。你几乎向我展示了一切。哈哈。我该怎么忽略这个命令呢?呃-没什么。通过不调用'base.WndProc'并传递消息,你已经有效地消耗了消息e、 在上面的示例中,您没有对它做任何操作。您将遇到其他示例,这些示例将使用自定义方法处理消息,但如果您希望其他进程显示该消息,您将消息传递回…嗯…它实际上对我的应用程序没有影响。我是否可以在窗口消息发出时查看这些消息?(为了澄清,我使用了WM_IME_ENDCOMPOSITION[0x10E]的适当常数)我找到了解决方法。谢谢你的帮助,但是=DAwesome-我相信“知识库”的精神,指定你所做的事情可能是有益的。添加它作为答案,我将取消标记我的回答作为答案…我想我可以做你解释的所有事情,除了设置一个变量忽略WM_IME_ENDCOMPOSITION。嗯..你很好uch向我展示了所有内容..哈哈。我如何忽略该命令?呃-什么都没有。通过不调用'base.WndProc'并传递消息,您已经有效地消耗了消息。在上面的示例中,您没有对其进行任何处理。您将遇到其他示例,它们将使用自定义方法处理消息,但是如果你想让其他进程显示你传递回的消息…嗯…它实际上对我的应用程序没有影响。有没有办法让我