Windows XP Embedded上で実行されているタッチスクリーンアプリケーションで作業しています。ユーザーが数秒間押し続けると、コンテキストメニューが表示されます。しかし、これはスクロールバーのようなコントロールを押さえつけることを妨げ、ユーザーがスクロールして最後までスクロールしないようにします。しかし、アプリケーション全体の右クリック機能を無効にしたくありません。私はスクロールバーのようなコントロールをこのアクションから除外したいだけです。ユーザーがタッチスクリーン上のスクロールバーの下向きの矢印を押下するとWindows XP EmbeddedでコントロールごとにC#Winformsアプリケーションを右クリック(押したままにする)を無効にします
は、ログには示しています
----Application Starts----
OnMouseDown: Left, Capture = true
[A few seconds later in the log, even though the user is still holding down...]
OnMouseUp: Left, Capture = false
OnMouseCaptureChanged, Capture = false
OnMouseDown: Right
OnMouseDown: Middle
OnMouseCaptureChanged, Capture = false
OnMouseCaptureChanged, Capture = false
OnMouseUp: Right
OnMouseUp: Middle
----Application Ends----
私はPreFilterMessageを使用してイベントを上下右と中央のマウスをフィルタリングし、しようとしました。カスタムスクロールバーコントロールのctorで、私は次を追加しました:Application.AddMessageFilter(this); PreFilterMessageの後ろに:
public bool PreFilterMessage(ref Message m)
{
switch (m.Msg)
{
case (int)WindowsMessages.WM_RBUTTONDOWN:
case (int)WindowsMessages.WM_RBUTTONUP:
case (int)WindowsMessages.WM_MBUTTONDOWN:
return true;
case (int)WindowsMessages.WM_MBUTTONUP:
System.Diagnostics.Debug.WriteLine("**** Context-menu interruption.");
return true;
}
return false;
}
これは引き続きユーザーの操作を中断します。
WM_MBUTTONUPのケースでOnMouseDownをプッシュしようとしましたが、自分のマウスダウンイベントがイベントキューに存在しないため、ユーザーが画面を放した後にスクロールバーがスクロールし続けますそれを止めるためのマウスはありません。
this.OnMouseDown(new MouseEventArgs(MouseButtons.Left, 1,
MousePosition.X, MousePosition.Y, 0));
代わりに左下を実行するためにSendInputを使用しようとしました。しかし、前と同じ問題が発生しました。
INPUT mouseDownInput = new INPUT();
mouseDownInput.type = SendInputEventType.InputMouse;
mouseDownInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_LEFTDOWN;
SendInput(1, ref mouseDownInput, Marshal.SizeOf(new INPUT()));
私はポストメッセージでこれを解決しようとしましたが、これは役に立ちませんでした。
PostMessage(this.Handle, (int)WindowsMessages.WM_LBUTTONDOWN,
(int)VirtualKeys.MK_LBUTTON,
(uint)((MousePosition.Y << 16) | MousePosition.X));
私は効果なしで、CTORにも以下のことを試してみました:
this.ContextMenu = new ContextMenu();
を私も私完全に無効になり、右ミドルクリックし、コンテキストメニューの効果はまだ左を引き起こしたマウスフックを試みましたマウスを押し上げると、ユーザーの操作が停止しました。
基本的に、これから回復する方法がないようで、私はこれに対処するためにstackoverflowで何の答えも見つけられませんでした。しかし、WinFormsに存在しないコントロールのOnPreviewMouseRightButtonDownとOnPreviewMouseRightButtonUpをオーバーライドする答えがstackoverflowのWPFに関する同様の質問がありました。
ヘルプ!