I recently got a link to a Facebook app which challenges you to how many times you can click a button in 30 seconds. After a couple of tries I got to around 180, yet I thought that I must be able to do better by making the computer click for me.
After a bit of research I came across two functions from MSDN named
mouse_event, both of which are provided in the Win32 API, and allow you to programatically simulate both mouse clicks and keyboard input. Thus I thought it was a great opportunity to try out C#’s p/invoke feature which allows the programmer to ‘import’ unmanaged functions from DLL libraries and use them in a C# application.
In this example I will only be using the
mouse_event function, however an implementation of
SendInput is included in the sources files, which are available for download at the bottom of this post.
The MSDN page of the
mouse_event function gives us some good information on how to implement the function, including a function header and a rundown on each of the parameters. They give the
mouse_event function the following header -
Which can then be imported for use in our C# application using using the DLLImport attribute and the
extern keyword (which simply indicates that the method is implemented externally) -
We can now call this unmanaged function as we would any other method already in our project. However to make good use of them, we need to find out a bit more information on each of the parameters.
They can be summed up as follows -
- dwFlags - In our case this parameter specifies which mouse button we would like to press depending on the integer value we pass
- dx - The relative mouse position along the x-axis
- dy - The relative mouse position along the y-axis
- dwData - Contains how much we would like to move the mouse wheel and in which direction
- dwExtraInfo - Contains extra information on the function call (not needed in our case)
In the case of this example we only have a need for the dwFlags parameter as we can easily set the cursor position using C# -
Before we finally call this method, it is a good idea to declare some constants, each describing which mouse button we would like to press. Details can again be found on the relevant MSDN page -
Finally we can now call the function, which will be wrapped into two methods -
As you can see we actually need to call the function twice, once for the mouse down action, and again for the mouse up action, to simulate a full mouse click. In this example we only use the
dwFlags parameter and pass zero for the rest as we have no need for them.
So we now have two methods that we can use to simulate a mouse click, yet no way of letting the user determine where to click, how many times to click, and what mouse button to click - the perfect chance to create a C# Windows Forms Application (a.ka. GUI) to make our program a little more presentable.
In my program, I have created a simple User Interface containing a list view, a few buttons, and a couple of textboxes, which will allow the user to specify a queue of points to click in sequence, as well as the ability to insert additional information for each click (button to press, time in between, etc).