Событие MouseDown средней кнопки колесика не происходит, если сначала прокрутить колесо мыши - PullRequest
1 голос
/ 12 июля 2020

Что-то не так с колесом мыши / средней кнопкой мыши в моем C# Windows приложении Forms и в других приложениях.

Как я могу определить, что средняя кнопка мыши удерживается в следующем сценарии? (потому что Control.MouseButtons лежит !)

Если я прокручиваю колесо мыши, быстро нажимаю кнопку колеса ( который равен установлен для создания средней кнопки мыши на панели управления), то этот код не обнаруживает событие MouseDown для средней кнопки мыши. Более того, если я продолжаю удерживать кнопку колесика нажатой и одновременно прокручиваю колесико, пока кнопка удерживается, то я получаю события MouseWheel, но Control.MouseButtons не означает, что средняя кнопка удерживается. Это кажется вопиющим недостатком. Кнопка колесика теперь физически удерживается, но, похоже, нет способа определить, что она нажата.

В отличие от этого, если я сначала нажму кнопку колесика (без прокрутите колесо) и удерживайте его, тогда событие колеса прокрутки правильно указывает, что средняя кнопка мыши нажата, как и следовало ожидать.

Похоже, я борюсь с некоторой секретной изобретательностью, которую реализовала Microsoft чтобы попытаться предотвратить случайное нажатие кнопок колесика при использовании колесика мыши. Но на самом деле это означает, что средняя кнопка мыши (кнопка с колесиком) неправильно определяется как нажатая, если колесо прокрутки слегка прокручено непосредственно перед нажатием. На самом деле я не знаю, реализована ли эта хитрость на уровне оборудования, на уровне драйверов, на уровне приложений или на чем-то еще. Я не совсем уверен, можно ли что-нибудь сделать.

Я особенно волнуюсь, потому что я пытался воспроизвести это явление в других приложениях, и я смог воспроизвести проблему в Blender , например. Так что, возможно, в C# ничего нельзя сделать. Или, может быть, есть настройка панели управления или что-то, что преодолеет это. Я не уверен, что это проблема оборудования, но подозреваю, что это может быть что-то с драйвером мыши - и, вероятно, это было сделано намеренно. Я не знаю, в какой степени такое поведение наблюдается с другими типами устройств мыши от других поставщиков, или если это просто эта мышь. Я не проверял, происходит ли это с той же мышью в других операционных системах.

Я надеюсь, что кто-то может сказать мне способ определить, что средняя кнопка мыши нажата в этом сценарии. Если нет, то мне также было бы любопытно узнать, является ли это ошибкой, которую можно исправить с помощью обновления программного обеспечения (драйвера?), Или это аппаратное ограничение этой мыши (или, возможно, всех устройств мыши).

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

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        MouseDown += Form1_MouseDown;
        MouseWheel += Form1_MouseWheel;
    }

    private void Form1_MouseWheel(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("MouseWheel {0}", MouseButtons);
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("MouseDown");
    }
}

Опять же, маги c шаги для воспроизведения проблемы:

  • прокрутите колесико мыши a немного
  • немедленно нажмите кнопку колесика мыши (которая настроена на нажатие средней кнопки мыши в соответствии со свойствами мыши / панелью управления).
  • (мы уже в плохом состоянии, потому что мы не получили событие нажатия средней мыши.)
  • продолжайте удерживать кнопку и прокручивать колесико, что приведет к тому, что приведенный выше код укажет, что кнопка мыши не нажата. (Control.MouseButtons был обманут, думая, что средняя кнопка мыши не нажата.)

Если любая из этих деталей имеет значение:

  • Microsoft IntelliMouse Optical USB
    • Дата драйвера: 2011-05-18
    • Версия драйвера 8.20.409.0
  • Windows 10 1909 (18363.900)
  • Visual Студия 2019
  • . NET Framework 4.7.2

Снимок экрана со свойствами мыши на панели управления

1 Ответ

1 голос
/ 12 июля 2020

MouseDown обнаруживает нажатие любых кнопок мыши, в то время как MouseClick определяет, когда кнопка отпускается. Предоставляя, что вы могли фиксировать следующие события:

    public Form1()
    {
        InitializeComponent();
        MouseDown += Form1_MouseDown;
        MouseClick += Form1_Click;
        MouseWheel += Form1_MouseWheel;
    }

    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Button pressed {0}", e.Button);
    }

    private void Form1_MouseWheel(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Wheel in action....");
    }

    private void Form1_Click(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Button Released {0}", e.Button);
    }

enter image description here

Edit

Screenshot with time stamp введите описание изображения здесь

Разница во времени между Wheel in action и Button pressed Middle составляет 32 мс.

Дайте мне знать, если это то, что вы ищете.

...