Событие MouseWheel не срабатывает при использовании любого элемента управления с помощью scrolbars (в С# Windows Forms)

Событие MouseWheel не срабатывает когда я использую любой элемент управления (ListBox, Panel, TextBox) с полосами прокрутки.

Чтобы воспроизвести проблему:

public class Form1 : Form
 {
  private readonly Button button1;
  private readonly TextBox textBox1;

  private void button1_MouseWheel(object sender, MouseEventArgs e)
  {
   ToString(); // doesn't fire when uncomment lines below
  }

  public Form1()
  {
   button1 = new Button();
   textBox1 = new TextBox();
   SuspendLayout();

   button1.Location = new System.Drawing.Point(80, 105);
   button1.Size = new System.Drawing.Size(75, 23);
   button1.MouseWheel += button1_MouseWheel;
   button1.Click += button1_Click;

   textBox1.Location = new System.Drawing.Point(338, 105);
   //textBox1.Multiline = true; // uncomment this
   //textBox1.ScrollBars = ScrollBars.Vertical;  // uncomment this 
   textBox1.Size = new System.Drawing.Size(100, 92);

   ClientSize = new System.Drawing.Size(604, 257);
   Controls.Add(textBox1);
   Controls.Add(button1);
   ResumeLayout(false);
   PerformLayout();
  }

  // Clicking the button sets Focus, but even I do it explicit Focus() or Select()
  // still doesn't work
  private void button1_Click(object sender, System.EventArgs e)
  {
   button1.Focus();
   button1.Select();
  }
 }

Ответ 1

Я нашел решение, значение по умолчанию - "Конфигурация мыши". Конфигурация по умолчанию для USB-мыши Lenovo USB:

Панель управления/Мышь/Колесо/Whell → Включить универсальную прокрутку;

Я изменил на:

Панель управления/Мышь/Колесо/Whell → Использовать только эмуляцию прокрутки Microsoft Office 97

Теперь в .net-коде MouseWheel, работающем с Focused.


Но вопросы:

  • Как я могу исправить это в .net-коде?
  • Как я могу обнаружить эту ситуацию в .net-коде?

Любые идеи?

Ответ 2

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

private void chart1_MouseEnter(object sender, EventArgs e)
{
    chart1.Focus();
}

После этого я мог без проблем получать события mouseWheel.

Ответ 3

Обычно вам необходимо убедиться, что элемент управления, который вы хотите обработать событие MouseWheel, активен.

Например, попробуйте вызвать button1.Select() в событии Form Load (или Show), а затем с помощью колеса прокрутки.

например:

private void Form1_Load(object sender, EventArgs e)
{
    button1.MouseWheel += new MouseEventHandler(button1_MouseWheel);

    button1.Select();  
}

Ответ 4

Я попробовал ваш пример и, независимо от того, были ли прокомментированы строки или нет, событие MouseWheel запускается только при нажатии кнопки. Такое поведение является особенностью. (событие MouseWheel, например события клавиатуры, переходит к сфокусированному управлению)