14

MouseWheel event doesn't fire when I' am using any control (ListBox, Panel, TextBox) with scrollbars.

To reproduce problem:

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();
  }
 }
halorty
  • 644
  • 1
  • 7
  • 11
  • Maybe the problem is in the mouse, I use "Lenovo USB Optical Wheel Mouse" (default configuration "Whell Button" function "Quick/AutoScroll") – halorty Jan 20 '10 at 07:32
  • I use: Windows Vista Buisness, .Net Framework 3.5 SP1, Visual Studio 2008 Standard Edition (all official hotfixes). Build Debug: Target Framework = .Net Framework 3.5, Output type = Windows Application – halorty Jan 20 '10 at 08:09
  • Mouse Configuration: Control Panel/Mouse/Wheel/Whell->Enable Universal Scrolling; Control Panel/Mouse/Wheel/Whell Button->Quick/AutoScrol; Control Panel/Mouse/Wheel/Scrolling Speed->Scroll=10 line(s) per noth; – halorty Jan 20 '10 at 08:14
  • I'm struggling with the same problem. I think many people confuse it with the "focused vs. hovered over" problematics. I have same ScrollableControl-based control which either triggers OnMouseWheel or doesn't, depending on whether it is displaying scrollbars currently or not. I think scrollbars somehow capture the wheel events, but I didn't study the issue enough yet. Did OP find a solution by any chance? – Yuri Makassiouk Apr 10 '15 at 09:08

4 Answers4

15

I was having the same problem, and what worked for me was to add a handler for the event MouseEnter in the control, that one is triggered with or without focus.

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

After that I could get the mouseWheel events with no problems.

Rodrigo Lopez
  • 871
  • 10
  • 16
  • 2
    Strangely, on one W10 compu the identical program did mousewheel, on the other it didn't, until I used your solution. – Jan Dec 25 '18 at 23:13
  • I have notified similar discrepancies between Windows 7 and 10 : the former will send mouse wheel events to active control only (eg: combobox) while second will send those events to control which is under mouse (eg: panel). Additionally, In Windows 7 if no control has focus, mouse wheel events are sent to main form. – tigrou Dec 04 '22 at 15:33
2

You normally need to make sure the control you want to handle the MouseWheel event is active.

For example try calling button1.Select() in the Form Load (or Shown) event and then using the scroll wheel.

eg:

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

    button1.Select();  
}
Ash
  • 60,973
  • 31
  • 151
  • 169
  • Still nothing, same problem,it is very strange, but in my case it doesn't work. Even I set Focus or Select, and Cursor is over the buton1, when I use mouse wheel, it scrolls textbox1 (sic!) – halorty Jan 20 '10 at 07:26
2

I found solution, gility is default "Mouse Configuration". Lenovo USB Optical Wheel Mouse default configuration is:

Control Panel/Mouse/Wheel/Whell->Enable Universal Scrolling;

I changed to:

Control Panel/Mouse/Wheel/Whell->Use Microsoft Office 97 Scrolling Emulation Only

Now in .net code MouseWheel working with Focused Control.


But questions are:

  • how can I fix it in .net code?
  • how can I detect this situation in .net code?

Any ideas ?

halorty
  • 644
  • 1
  • 7
  • 11
0

I tried your example, and, whether the lines were commented or not, the MouseWheel event only fires if the button is focused. This behavior is by design. (the MouseWheel event, like keyboard events, goes to the focused control)

SLaks
  • 868,454
  • 176
  • 1,908
  • 1,964
  • I read about i documentation but, it is very strange, but in my case it doesn't work: I add to code: public Form1() { (...) button1.Click += button1_Click; (...) } private void button1_Click(object sender, System.EventArgs e) { button1.Focus(); } Not working, even I set Focus, and Cursor is over the buton1, when I use mouse wheel, it scrolls textbox1 (sic!) – halorty Jan 20 '10 at 07:23