我正在处理与This Question完全相同的情况。
没有答案,问题太旧,所以如果OP找到了解决方案,我无法留下任何评论。
我刚刚学习p / invoke的基础知识,至少很难理解它。
我一直在做很多搜索。我发现This question将我与This question/answer联系起来,但仍然无法理解我需要做什么。
我想我想要一种方法来操纵WM_IME命令,或者至少在鼠标点击时禁用WM_IME_ENDCOMPOSITION。
提前谢谢
答案 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