Захват событий мыши в производном элементе управления кнопки Winforms - PullRequest
0 голосов
/ 03 июля 2018

У меня есть элемент управления winforms, полученный из Button, целью которого является отображение некоторого диалогового окна. Таким образом, элемент управления можно «активировать» с помощью табуляции или щелчком мыши в соответствии с состоянием приложения. Принудительный доступ к вкладке требуется при некоторых обстоятельствах, чтобы гарантировать заполнение предыдущих полей. Поэтому мне нужно «захватывать» щелчки мыши на нем, чтобы разрешить или запретить событие мыши в соответствии с состоянием приложения. Чтобы перехватить клавишу табуляции, я переопределяю OnEnter (), и она работает нормально. Я также переопределил OnClick (), OnMouseDown () и OnMouseClick () безрезультатно: управление программой всегда молча передается методу OnEnter (). Отладчик никогда не останавливается в методах OnClick () или OnMouse * (), поэтому я не могу сообщить о происхождении события и предотвратить выполнение ядра при необходимости. Может ли кто-нибудь помочь? Конечно, я не хотел бы перехватывать очередь сообщений Windows; некоторые предыдущие события не были счастливы. ТИА

1 Ответ

0 голосов
/ 04 июля 2018

Использование простой фильтрации сообщений, как описано здесь (https://www.daniweb.com/programming/software-development/threads/304777/how-to-temporarily-disabling-mouse-clicks-on-a-vb-net-form) с таким классом

// relevant usings...
using System.Security.Permissions;
...
using System.Windows.Forms;

namespace YourNameSpace
{
    public class MouseFilter : IMessageFilter
    {
        protected static bool inEffect = false;
        public static bool ActiveFiltering { set { inEffect = value; } }
        const int LButtonDown = 0x201;
        const int LButtonUp = 0x202;
        const int LButtonDoubleClick = 0x203;

        [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
        public bool PreFilterMessage( ref Message m )
        {
            if (!inEffect)
                return false;
            bool result = false;
            switch (m.Msg) {
                case LButtonDown:
                case LButtonUp:
                case LButtonDoubleClick:
                     result = true;
                     break;
            }
            return result;
        }
    }
}

Статическое свойство ActiveFiltering предоставляет способ включить / отключить фильтрацию щелчков мыши при необходимости. Конечно, класс Program должен выполняться Application.AddMessageFilter (new MouseFilter ()); но, будучи inEffect = false, это не мешает нормальной работе мыши. Мой элемент управления отключает мышь, когда это необходимо, и заботится о том, чтобы оставить его включенным в противном случае. Решение не идеальное, но то, что возможно. Хуже всего то, что хотя элемент управления отменяет щелчки мыши, никто не может перейти к другому элементу управления или к самому окну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...