Я работаю над приложением с сенсорным экраном, которое работает на Windows XP Embedded.Если пользователь нажимает и удерживает в течение нескольких секунд, появится контекстное меню.Однако это мешает удерживать элементы управления, такие как полосы прокрутки, не позволяя пользователю полностью прокрутить до конца.Однако я не хочу отключать функцию щелчка правой кнопкой мыши во всем приложении.Я хочу, чтобы элементы управления, такие как полосы прокрутки, были исключены из этого действия.
Когда пользователь нажимает стрелку вниз на полосе прокрутки на сенсорном экране, журнал показывает:
----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;
}
, который все еще прерывает действие пользователя.
Я попытался выдвинуть OnMouseDown в случае WM_MBUTTONUP, однако это просто заставляет полосу прокрутки продолжать прокручиваться послепользователь отпустил экран, потому что его собственное событие мыши больше не находится в очереди событий, поэтому нет мыши, чтобы остановить его.
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 для решения этой проблемы.Однако был аналогичный вопрос относительно WPF для stackoverflow, где ответом было переопределение OnPreviewMouseRightButtonDown и OnPreviewMouseRightButtonUp для элемента управления, которого нет в Winforms.
Help!