Simulate input/Mouse

From Rosetta Code
Simulate input/Mouse
You are encouraged to solve this task according to the task description, using any language you may know.
Simulate the click of a mouse button by the user. Specify if the target GUI may be externally created.


target gui may be externally created.

WinActivate, ahk_class MozillaUIWindowClass
Click 200, 200 right ; relative to external window (firefox)
sleep, 2000
CoordMode, Mouse, Screen
Click 400, 400 right ; relative to top left corner of the screen.

Common Lisp[edit]

Library: xdotool

The xdotool have to be installed on the machine (installable through apt-get). Tested on Lubuntu 14.04.

(defun sh (cmd)
#+clisp (shell cmd)
#+ecl (si:system cmd)
#+sbcl (sb-ext:run-program "/bin/sh" (list "-c" cmd) :input nil :output *standard-output*)
#+clozure (ccl:run-program "/bin/sh" (list "-c" cmd) :input nil :output *standard-output*))
(sh "xdotool mousemove 0 0 click 1")
(sleep 2)
(sh "xdotool mousemove 300 300 click 1")


You can simulate a mouse click on a button by asking that button to fire its event listeners. This approach only works for the program's own GUI:

using fwt
using gfx
class Main
public static Void main ()
button1 := Button
text = "don't click!"
onAction.add |Event e|
echo ("clicked by code")
button2 := Button
text = "click"
onAction.add |Event e|
// fire all the event listeners on button1
title = "simulate mouse event"
size = Size (300, 200)

Alternatively, if you are running on the Java Runtime, you can use Java's 'robot' library to click anywhere on the screen, and so interact with widgets from other programs:

using [java] java.awt::Robot
using [java] java.awt.event::InputEvent
using fwt
using gfx
class Main
public static Void main ()
button := Button
text = "click for robot"
onAction.add |Event e|
robot := Robot ()
robot.mouseMove (50, 50) // move to screen point 50, 50
robot.mousePress (InputEvent.BUTTON1_MASK) // and click mouse
robot.mouseRelease (InputEvent.BUTTON1_MASK)
title = "simulate mouse event"
size = Size (300, 200)


Start,Programs,Accessories,Notepad,Textbox,Type:Hello World[pling],Menu:File,Save,


You can click on any Component using a Robot and the Component's location:

Point p = component.getLocation();
Robot robot = new Robot();
robot.mouseMove(p.getX(), p.getY()); //you may want to move a few pixels closer to the center by adding to these values
robot.mousePress(InputEvent.BUTTON1_MASK); //BUTTON1_MASK is the left button,
//BUTTON2_MASK is the middle button, BUTTON3_MASK is the right button

If you don't have a reference to the component, you'll need to guess at where it is.

Library: Swing

If you have a reference to the AbstractButton this is simpler:

button.doClick(); //optionally, give an integer argument for the number of milliseconds to hold the button down


This may be done using Julia's C call FFI:

# Wrap win32 API function mouse_event() from the User32 dll.
function mouse_event_wrapper(dwFlags,dx,dy,dwData,dwExtraInfo)
ccall((:mouse_event, "User32"),stdcall,Void,(UInt32,UInt32,UInt32,UInt32,UInt),dwFlags,dx,dy,dwData,dwExtraInfo)
function click()


// version 1.1.2
import java.awt.Robot
import java.awt.event.InputEvent
fun sendClick(buttons: Int) {
val r = Robot()
fun main(args: Array<String>) {
sendClick(InputEvent.BUTTON3_DOWN_MASK) // simulate a click of the mouse's right button


Using Tk events, this only works with internal windows.

[QTk] = { ['x-oz://system/wp/QTk.ozf']}
Window = { td(button(text:"Click me" handle:Button))}
{Window show}
{Delay 500}
{Tk.send event(generate Button "<ButtonPress-1>")}
{Delay 500}
{Tk.send event(generate Button "<ButtonRelease-1>")}


PicoLisp comes with a dedicated browser GUI. A library based on web scraping (in "lib/scrape.l") can be used to drive that GUI under program control. It allows to read GUI pages, click on HTML links, enter text into forms, and press submit buttons. In that way one application can control another application.

The documented demo application, which is also available online at, is used in the following example. Mouse input is simulated with the functions 'click' (click on a HTML link) and 'press' (press a submit button).

(load "@lib/http.l" "@lib/scrape.l")
# Connect to the demo app at
(scrape "" 80 "8080")
# Log in
(expect "'admin' logged in"
(enter 3 "admin") # Enter user name into 3rd field
(enter 4 "admin") # Enter password into 4th field
(press "login") ) # Press the "login" button
(click "Items") # Open "Items" dialog
(click "Spare Part") # Click on "Spare Part" article
(prinl (value 8)) # Print the price (12.50)
(click "logout") # Log out



The same example is used in the related task Simulate input/Keyboard#PicoLisp.


This code is Windows only.

Macro Click()
mouse_event_(#MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
mouse_event_(#MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
; Click at the current location
Delay(1000) ; Wait a second
; Move to a new location and click it
SetCursorPos_(50, 50)
Library: AutoWin
; The same function as above, but using AutoWin UserLibray
AW_MouseClick(#PB_MouseButton_Left, 50, 50)


In Windows (GUI can be externally created):

import ctypes
def click():
ctypes.windll.user32.mouse_event(0x2, 0,0,0,0) # Mouse LClick Down, relative coords, dx=0, dy=0
ctypes.windll.user32.mouse_event(0x4, 0,0,0,0) # Mouse LClick Up, relative coords, dx=0, dy=0

Library: PyAutoGUI
import pyautogui
pyautogui.moveTo(100, 200) # moves mouse to X of 100, Y of 200.
pyautogui.moveTo(None, 500) # moves mouse to X of 100, Y of 500.
pyautogui.moveTo(600, None) # moves mouse to X of 600, Y of 500.
pyautogui.moveTo(100, 200, 2) # moves mouse to X of 100, Y of 200 over 2 seconds
pyautogui.moveRel(0, 50) # move the mouse down 50 pixels.
pyautogui.moveRel(-30, 0) # move the mouse left 30 pixels. # Left button click on current position, interval=0.25) # with a quarter second pause in between clicks, 5) # Mouse left button click, x=10, y=5, 250, button='right') # Mouse right button click, x=200, y=250
pyautogui.scroll(10) # scroll up 10 "clicks"
pyautogui.scroll(10, x=100, y=100) # move mouse cursor to 100, 200, then scroll up 10 "clicks"


Translation of: Python

Same as the Python entry: use a User32 function to simulate a mouse click.

#lang at-exp racket
(require ffi/unsafe)
(define mouse-event
(get-ffi-obj "mouse_event" (ffi-lib "user32")
(_fun _int32 _int32 _int32 _int32 _pointer -> _void)))
(mouse-event #x2 0 0 0 #f)
(mouse-event #x4 0 0 0 #f)


Library: Scala
  val (p , robot)= (component.location, new Robot())
robot.mouseMove(p.getX().toInt, p.getY().toInt) //you may want to move a few pixels closer to the center by adding to these values
robot.mousePress(InputEvent.BUTTON1_MASK) //BUTTON1_MASK is the left button


Within an Application[edit]

Library: Tk
# Simulate a full click cycle: button down and up
event generate .okBtn <ButtonPress-1> -x 5 -y 5
event generate .okBtn <ButtonRelease-1> -x 5 -y 5

Note that many of Tk's windows also need appropriate <Enter> and <Leave> events in order to work correctly. For the process of actually simulating a click on a button, it is actually easier to work at the method-call level rather than the event generation level:

.okBtn invoke