9

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.

John
  • 5,735
  • 3
  • 46
  • 62

3 Answers3

7

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!")
Dorian
  • 22,759
  • 8
  • 120
  • 116
Ryan McGeary
  • 235,892
  • 13
  • 95
  • 104
5

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.

Seanny123
  • 8,776
  • 13
  • 68
  • 124
0

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!"')
kbrock
  • 958
  • 12
  • 15