Отключить щелчок правой кнопкой мыши (нажать и удерживать) в приложении C # Winforms для каждого элемента управления в Windows XP Embedded - PullRequest
2 голосов
/ 25 октября 2011

Я работаю над приложением с сенсорным экраном, которое работает на 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!

1 Ответ

0 голосов
/ 02 марта 2012

в вашем случае у меня есть только идея, как можно достичь этого результата.

Вы должны создать метод для отображения всплывающего меню и добавить элемент управления временем в вашей форме.

Начало события OnMouseDownВаше управление таймером и тиковое событие Генделя, сохраняйте время начала в переменной и проверяйте его на каждом тике. Если вы хотите, чтобы пользователь нажимал в течение 3 секунд, вы должны проверить это следующим образом, считая, что у вас есть переменная времени начала, названная'StartTime':

if((DateTime.Now - StartTime).Seconds >= 3)

, если истекшее время больше 3 секунд, то отобразить всплывающее меню

now OnMouseUp событие, вы должны остановить таймер.

...