То, что я в итоге сделал, поскольку 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.Это было определено положением мыши (как и при отключенных щелчках мыши, я не смог бы ничего щелкнуть, чтобы включить его).
[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