Click here to Skip to main content
13,408,987 members (45,030 online)
Click here to Skip to main content
Add your own
alternative version


56 bookmarked
Posted 2 Jun 2005

Mouse Events

, 2 Jun 2005
Rate this:
Please Sign up or sign in to vote.
A helper class to expand on the mouse events provided by the Control class.

Sample Image - mouseEventDemo.png


I was recently implementing some right-click functionality for a TreeView, and I got to thinking, how many times have I handled the MouseUp event and tested for Buttons.Right because there isn't a RightClick event in the Control class? So I've written a mouse event helper class that lets you connect directly to these specific events:

public event EventHandler LeftClick;
public event EventHandler LeftDoubleClick;
public event EventHandler MiddleDoubleClick;
public event EventHandler RightDoubleClick;
public event EventHandler MiddleClick;
public event EventHandler RightClick;
public event MouseEventHandler LeftMouseDown;
public event MouseEventHandler LeftMouseUp;
public event MouseEventHandler MiddleMouseDown;
public event MouseEventHandler MiddleMouseUp;
public event MouseEventHandler RightMouseDown;
public event MouseEventHandler RightMouseUp;
public event MouseEventHandler WheelForward;
public event MouseEventHandler WheelBackward;


The implementation is trivial. The MouseHelper class hooks the following control events:

protected virtual void Initialize()
  control.Click+=new EventHandler(OnClick);
  control.DoubleClick+=new EventHandler(OnDoubleClick);
  control.MouseDown+=new MouseEventHandler(OnMouseDown);
  control.MouseUp+=new MouseEventHandler(OnMouseUp);
  control.MouseWheel+=new MouseEventHandler(OnMouseWheel);

A typical handler looks like this:

private void OnClick(object sender, EventArgs e)
    case MouseButtons.Left:
      if (LeftClick != null)
        LeftClick(sender, e);

    case MouseButtons.Middle:
      if (MiddleClick != null)
        MiddleClick(sender, e);

    case MouseButtons.Right:
      if (RightClick != null)
        RightClick(sender, e);

You will note that this isn't intended to handle situations where more than one mouse button is being held down at a time.

Wheel Movement

One thing that's odd is that, for wheel movement, the documentation says that:

A positive value indicates that the wheel was rotated forward, away from the user; a negative value indicates that the wheel was rotated backward, towards the user.

However, if I push the wheel away from me, what I think would mean forward, the program actually says I'm moving the wheel backwards.


To use the MouseHelper class:

  • Instantiate the class and pass into the constructor the control for which you wish to trap mouse events.
  • Assign the control to the MouseHelper's Control property.
  • Use the MouseHelper's AddControl method.

You can add more than one control to the same mouse helper, which lets you combine mouse events from different controls into a single handler.

You should note that in the typical usage, you would use a unique MouseHelper instance for every Control class that you need to capture mouse events for. This is a drawback, but I wanted to keep the class simple. An alternative would be to have a static factory method that returns a MouseHandler instance for the specific control you want to extend. And possibly, an even more interesting implementation would be to have MouseHandler implement IExtenderProvider. Those may be future additions.


That's it! It's really simple, and now I have a helper class that takes care of the drudgery of writing over and over again the same "is the right button clicked" code. And my other motivation for writing this is because there was no way to handle right clicks declaratively. For example, I'd like to do something like this:

<TreeView RightClick="PopupMenu"/>

without writing a custom handler. Now I can!


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Marc Clifton
United States United States
Marc is the creator of two open source projects, MyXaml, a declarative (XML) instantiation engine and the Advanced Unit Testing framework, and Interacx, a commercial n-tier RAD application suite.  Visit his website,, where you will find many of his articles and his blog.

Marc lives in Philmont, NY.

You may also be interested in...

Comments and Discussions

Generalapp to record Test case and record mouse movement and keyboard clicks Pin
Member 117448536-Jun-15 21:31
memberMember 117448536-Jun-15 21:31 
GeneralMy vote of 4 Pin
Arash3agel24-Sep-11 22:19
memberArash3agel24-Sep-11 22:19 
GeneralMy vote of 5 Pin
Just_Michel27-Mar-11 21:41
memberJust_Michel27-Mar-11 21:41 
GeneralVery nice... and brief usage note. Pin
dsuilmann6-Oct-09 9:37
memberdsuilmann6-Oct-09 9:37 
GeneralGreat article! I am going to bookmark it. Pin
DrABELL16-Sep-09 16:39
memberDrABELL16-Sep-09 16:39 
QuestionMouseHelper for Web.UI.Forms Pin
alvarog0123-Feb-09 22:17
memberalvarog0123-Feb-09 22:17 
GeneralMe too! Pin
PIEBALDconsult13-Jun-08 16:24
memberPIEBALDconsult13-Jun-08 16:24 
QuestionIs there has MouseMoveStop? Pin
AndyLang12-Jul-07 5:26
memberAndyLang12-Jul-07 5:26 
QuestionWheel click ? Pin
Christian Graus28-Sep-06 0:21
staffChristian Graus28-Sep-06 0:21 
AnswerRe: Wheel click ? Pin
Marc Clifton28-Sep-06 2:00
protectorMarc Clifton28-Sep-06 2:00 
GeneralRe: Wheel click ? Pin
Christian Graus28-Sep-06 2:10
staffChristian Graus28-Sep-06 2:10 
Questionproblem with listview columnheader Pin
rm_pkt17-Jan-06 20:19
memberrm_pkt17-Jan-06 20:19 
QuestionMultiple Controls to same MouseHelper? Pin
Doncp8-Dec-05 11:27
memberDoncp8-Dec-05 11:27 
AnswerRe: Multiple Controls to same MouseHelper? Pin
Marc Clifton8-Dec-05 12:14
protectorMarc Clifton8-Dec-05 12:14 
QuestionListBox not supported? Pin
Doncp7-Dec-05 11:38
memberDoncp7-Dec-05 11:38 
AnswerRe: ListBox not supported? Pin
Marc Clifton7-Dec-05 12:49
protectorMarc Clifton7-Dec-05 12:49 
GeneralRe: ListBox not supported? Pin
Doncp8-Dec-05 5:48
memberDoncp8-Dec-05 5:48 
GeneralRe: ListBox not supported? Pin
Marc Clifton8-Dec-05 5:56
protectorMarc Clifton8-Dec-05 5:56 
Generalpersonally... Pin
MadHatter ¢21-Jun-05 5:24
MadHatter ¢
21-Jun-05 5:24 
GeneralSuggestion Pin
Maximilian Hänel6-Jun-05 23:59
memberMaximilian Hänel6-Jun-05 23:59 
GeneralAnother Great Article Pin
SHaroz3-Jun-05 18:41
memberSHaroz3-Jun-05 18:41 
GeneralGreat idea! Pin
Robert Rohde2-Jun-05 12:52
memberRobert Rohde2-Jun-05 12:52 
GeneralRe: Great idea! Pin
Marc Clifton2-Jun-05 13:08
protectorMarc Clifton2-Jun-05 13:08 
Robert Rohde wrote:
Would you mind if I take your idea and make something similar with more functionality for a new article?

Not at all. Go for it! I was hoping this very simple yet never before seen idea would spur some serious development!

Robert Rohde wrote:
I think for example of coordinates in the DoubleClick events

You bet!

Robert Rohde wrote:
The IExtenderProvider idea also sounds good

Hmmm. I think you can. And if so, then they show up in the designer. Smile | :)

Let me know how it turns out!


My website

Latest Articles:
Undo/Redo Buffer
Memento Design Pattern
GeneralThe file is missing. Pin
yuren19782-Jun-05 10:49
memberyuren19782-Jun-05 10:49 
GeneralRe: The file is missing. Pin
Marc Clifton2-Jun-05 11:29
protectorMarc Clifton2-Jun-05 11:29 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.180221.1 | Last Updated 2 Jun 2005
Article Copyright 2005 by Marc Clifton
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid