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