Что-то не так с колесом мыши / средней кнопкой мыши в моем 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
Снимок экрана со свойствами мыши на панели управления