C# 韩国虚拟键盘在鼠标单击时禁用WM_IME_ENDCOMPOSITION
我所处理的情况和你的完全一样 没有答案,问题也太老了,所以我不能留下任何评论,看看OP是否找到了解决方案 我刚刚学习了p/invoke的基础知识,但至少不太理解它 我已经做了相当多的搜索。我找到了我的联系,但仍然无法理解我需要做什么 我想我是在寻求一种方法来操作WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITIONC# 韩国虚拟键盘在鼠标单击时禁用WM_IME_ENDCOMPOSITION,c#,click,ime,virtual-keyboard,C#,Click,Ime,Virtual Keyboard,我所处理的情况和你的完全一样 没有答案,问题也太老了,所以我不能留下任何评论,看看OP是否找到了解决方案 我刚刚学习了p/invoke的基础知识,但至少不太理解它 我已经做了相当多的搜索。我找到了我的联系,但仍然无法理解我需要做什么 我想我是在寻求一种方法来操作WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITION 提前感谢您IME方面没有专家,但您不能只覆盖“WndProc”而不传递“消息”,因为它会阻止其他应用程序/控件处理它吗?WndProc捕获操作系统生成的
提前感谢您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'并传递消息,您已经有效地消耗了消息。在上面的示例中,您没有对其进行任何处理。您将遇到其他示例,它们将使用自定义方法处理消息,但是如果你想让其他进程显示你传递回的消息…嗯…它实际上对我的应用程序没有影响。有没有办法让我