Question

Is there an operating system neutral way for Ruby to send keyboard and mouse events to the underlying operating system?

One obvious (to me) approach is to use the Ruby/Java bindings and use java.awt.Robot, but that just seems silly.

Was it helpful?

Solution

For Mac:

gem install rb-appscript

Then you can test it with a script like this:

require "rubygems"
require "appscript"
include Appscript

app("TextEdit").activate
app("System Events").keystroke("Look Ma, keystrokes!")

For Windows: (untested, borrowed from this thread)

require "win32ole"

wsh = WIN32OLE.new("WScript.Shell")
wsh.Run("Notepad.exe")
while not wsh.AppActivate("Notepad")
  sleep .1
end
wsh.SendKeys("Look Ma, keystrokes!")

OTHER TIPS

For completeness sake, I thought I would include a solution for if you're using Linux.

On Linux, for automating keystrokes you can use xdotool. There also a gem for Ruby, but it's not really required considering that send keystrokes is a easy as:

%x(xdotool key super+w) #this would press the keys super and w simultaneoulsy

There's also mouse events too.

Unfortunatly, rb-applescript is a little dated and wonky.

For the mac, you may want to use:

%x(osascript -e 'tell application "System Events" to keystroke "Look Ma, keystrokes!"')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top