Click here to Skip to main content
Click here to Skip to main content

Global Mouse and Keyboard Library

By , 8 Aug 2008
 

Introduction

This article explains how to use the mouse and keyboard library that I have created. This library consists of two things: global mouse and keyboard hooks, and global mouse and keyboard simulators.

The global hooks contain a set of events that follow the .NET event model, so they should be very simple to use if you've done anything with events before.

The simulators will actually simulate mouse movements, clicks, keyboard presses, etc. This can be useful for macro recording (which is one of the sample projects), and of course, messing with your friends. :)

Background

I've found a lot of hook and simulator code out there, but a lot of it was not very organized, and a bit hard to use. The goal here is to make a very simple and easy-to-use library for mouse and keyboard operations not natively supported by .NET.

Global Hooks

This section will explain how to use the global hooks which can capture mouse and keyboard events from any application. These events are very similar to the ones that appear on Windows controls, so they should look familiar.

Using the mouse hook:

// Create the mouse hook
MouseHook mouseHook = new MouseHook();

// Capture the events
mouseHook.MouseMove += new MouseEventHandler(mouseHook_MouseMove);
mouseHook.MouseDown += new MouseEventHandler(mouseHook_MouseDown);
mouseHook.MouseUp += new MouseEventHandler(mouseHook_MouseUp);
mouseHook.MouseWheel += new MouseEventHandler(mouseHook_MouseWheel); 

// Start watching for mouse events
mouseHook.Start();

...

// Stop watching (don't forget to do this before closing application!)
mouseHook.Stop();

Using the keyboard hook:

// Create the keyboard hook
KeyboardHook keyboardHook = new KeyboardHook();

// Capture the events
keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);
keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);

// Start watching for keyboard events
keyboardHook.Start();

...

// Stop watching (don't forget to do this before closing application!)
keyboardHook.Stop();

Note: When you are setting the events, Visual Studio will name and create a blank method for you. You only need to type this much on the event ...

keyboardHook.KeyDown +=

...and then hit TAB two times. Visual Studio will finish the rest of the line, and will go out and create the blank method for you. This is a nice feature, and saves a lot of time; use it!

Simulators

This section will explain how to use the the mouse and keyboard simulators to simulate mouse clicks and keyboard key presses. Both the KeyboardSimulator and MouseSimulator classes are static, so they are pretty simple to use.

Simulating mouse events:

// Press Left Mouse Button Down
MouseSimulator.MouseDown(MouseButton.Left);

// Let Left Mouse Button Up
MouseSimulator.MouseUp(MouseButton.Left);

// Press down and Let up Left Mouse Button
// (equivalent to two lines above)
MouseSimulator.Click(MouseButton.Left);

// Double click Left Mouse button
// (equivalent to two Click()s above)
MouseSimulator.DoubleClick(MouseButton.Left);

The code above is used to simulate pressing and letting up a certain mouse button. The one parameter is just an enumeration of the three possible mouse buttons: Left, Right, and Middle.

Moving the mouse position:

// Move mouse cursor to Top Left of screen
MouseSimulator.X = 0;
MouseSimulator.Y = 0;

// Move the mouse cursor to the right by 20 pixels
MouseSimulator.X += 20;

The X and Y above are properties. You can use them to get the current position of the mouse cursor, or you can set them to move the mouse cursor to a new location.

Keyboard simulators:

// Press the A Key Down
KeyboardSimulator.KeyDown(Keys.A);

// Let the A Key back up
KeyboardSimulator.KeyUp(Keys.A);

// Press A down, and let up (same as two above)
KeyboardSimulator.KeyPress(Keys.A);

The code above will simulate keyboard key presses. You can press a key down (first line), which doesn't let it up yet. The second line, KeyUp, will release a key that has been pressed down, the third line with do both steps in one shot.

I also included some standard keyboard shortcuts. These can all be done with the code above, but it simplifies it a bit, and makes the code a bit more readable and obvious.

// Simulate (Ctrl + C) shortcut, which is copy for most applications
KeyboardSimulator.SimulateStandardShortcut(StandardShortcut.Copy);

// This does the same as above
KeyboardSimulator.KeyDown(Keys.Control);
KeyboardSimulator.KeyPress(Keys.C);
KeyboardSimulator.KeyUp(Keys.Control);

The code above does the exact same thing twice, except the first is a bit shorter and more obvious.

A Sample Application: Global Macro Recorder

A macro recorder is a great example for this library, since we can use the hooks to record the macro, and the simulators to play back.

Check out the Macro project in the downloadable source code.

Future Additions / Revisions

I'm going to edit and add to this library over time as I get feedback. If you think something should be added, changed, or find a problem, please post in the comments section, and I'll do what I can. Thanks. :)

Revision History

  • 7/23/08: Released first version in three versions of .NET.
  • 7/28/08: Added the Application.ApplicationExit event to make sure hooks stop.
  • 8/8/08: Got rid of the debug code in the Macro example, added the MouseWheel method to the MouseSimulator class, and got rid of the duplicate MousePoint class used in MouseSimulator.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Brian Geiman
Software Developer RR Donnelley
United States United States
Member
No Biography provided

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionGlobal Macro Record Example - Not responding itselfmemberPham Van Luan8 Dec '11 - 4:13 
QuestionGlobal Mouse and Keyboard Librarymembershfitythrower6 Dec '11 - 6:35 
QuestionSolve my Problem Pleasemembershfitythrower6 Dec '11 - 6:32 
AnswerRe: Solve my Problem PleasememberPham Van Luan24 Dec '11 - 20:57 
GeneralRe: Solve my Problem Pleasemembershfitythrower15 Jan '12 - 19:43 
Can u help me in saving the events to a file so that i could play them like macro later. I am in urgent need of this example kindly help me with a working example....
Questionproblem when using with the float data type [modified]memberirFan9127 Oct '11 - 21:53 
QuestionCan't run normally in .net4.0memberhambor29 Aug '11 - 3:24 
AnswerRe: Can't run normally in .net4.0memberAuspexPT19 Nov '11 - 9:40 
QuestionUsing this to create a Keyboard Layoutmembervinodonly8 Aug '11 - 2:37 
GeneralGreat workmemberizayoikagami29 Jul '11 - 6:31 
Questionto use this code in .NET 4.0memberBillWoodruff5 Jul '11 - 18:50 
QuestionHow can I press hotkey Ctrl + C and double clickmemberlampv0120327 Jun '11 - 6:44 
GeneralIt's not work!memberrakkang18 Jun '11 - 2:20 
GeneralMy vote of 5memberjo le serb18 Jun '11 - 0:59 
QuestionCan I use this library in VB.net?memberManindra293 May '11 - 23:18 
GeneralMy vote of 2membercharles henington19 Apr '11 - 11:22 
GeneralRe: My vote of 2memberjacob_suibowen3 May '11 - 13:22 
GeneralRe: My vote of 2memberevolaz19 May '11 - 3:46 
GeneralRe: My vote of 2memberAamir Butt3 Sep '11 - 7:20 
QuestionHow to stop play eventsmemberStreetMan17 Apr '11 - 20:34 
AnswerRe: How to stop play eventsmembercharles henington18 Apr '11 - 11:50 
GeneralMy vote of 5memberAli Al Omairi(Abu AlHassan)13 Apr '11 - 19:58 
GeneralMy vote of 1memberAli Al Omairi(Abu AlHassan)13 Apr '11 - 4:46 
GeneralRe: My vote of 1membercharles henington13 Apr '11 - 5:18 
GeneralRe: My vote of 1memberAli Al Omairi(Abu AlHassan)13 Apr '11 - 19:56 
GeneralOutstandingmemberDavid H Robertson10 Apr '11 - 3:05 
QuestionHow to save macros in file???? [modified]memberStreetMan31 Mar '11 - 3:28 
AnswerRe: How to save macros in file????membercharles henington13 Apr '11 - 5:29 
Generalnice workmemberReymonARG22 Mar '11 - 18:22 
GeneralProblem with double chars like ^^ or ~~memberThiago Burgo17 Mar '11 - 7:37 
Generalawesome!mvpChrist Kennedy23 Feb '11 - 6:45 
GeneralSaving List<> of events to a filememberHoracio Prada19 Feb '11 - 11:27 
GeneralSaving the recorded eventsmemberHoracio Prada19 Feb '11 - 4:59 
GeneralExcellentmemberKountree29 Dec '10 - 8:37 
GeneralMy vote of 5memberMatthew Dally21 Dec '10 - 1:38 
GeneralFantastic ! Brilliant solution to a problem !membervectoraudiouk27 Nov '10 - 5:20 
GeneralMy vote of 5membervectoraudiouk27 Nov '10 - 5:19 
GeneralShift key is not recorded in the macro recordermemberSunny127015 Nov '10 - 2:47 
GeneralProblem with cyrillic lettersmemberpcpavlov23 Oct '10 - 23:12 
GeneralRe: Problem with cyrillic letters [modified]memberpcpavlov24 Oct '10 - 1:02 
GeneralMy vote of 5memberpcpavlov20 Oct '10 - 22:27 
GeneralMy vote of 5membermsp.netdev13 Oct '10 - 3:41 
GeneralMy vote of 5memberdwane_miller1 Oct '10 - 5:32 
QuestionHow do I stop the playback events by pressing a key?memberalexmbra12 Sep '10 - 10:17 
GeneralFix for .NET 4adminThiru Thirunavukarasu25 Aug '10 - 14:04 
GeneralRe: Fix for .NET 4memberMr Pleco4 Sep '10 - 7:49 
GeneralMy vote of 5memberAslam_Iqbal15 Jul '10 - 4:08 
GeneralSuppressingmemberSen Dog31 May '10 - 2:09 
QuestionIt doesn't seems to work in the 2010 beta ver ??memberAfter-Darkness3 Apr '10 - 1:50 
Generale.Handled not workingmemberyannlh15 Mar '10 - 11:40 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 8 Aug 2008
Article Copyright 2008 by Brian Geiman
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid