原です。

> 岡です。
> >ruby から InternetExplorer を立ち上げて、適当なページを見
> >せて、画面上で起こったイベントを何かのメソッドの返値として 
> >ruby に戻すことってできるのでしょうか。
> 
> 私も実はよく理解していないんですが、こんな感じでIEで発生する
> イベントを取り込んだことがあります。
> require 'win32ole'
> def event_handler(event, *args)
>   puts "***** #{event} event fired. ***********"
> end
> ie = WIN32OLE.new('InternetExplorer.Application')
> ie.visible = true
> event = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents')
> event.on_event {|*args| 
>   event_handler(*args)
> }
> ie.Navigate('http://www.ruby-lang.org/')
> loop do
>   WIN32OLE_EVENT.message_loop
> end

わお。無理かと思っていた。出来るんですね。

こんな風にしてみました。

-----^ test-event.rb
#!/usr/bin/env ruby
require 'win32ole'
require 'cgi'

file = File.expand_path(ARGV.shift)
ie = WIN32OLE.new('InternetExplorer.Application')
ie.visible = true
e = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents')
e.on_event('NavigateComplete'){|*args|
  query = /^[^?]*\??(.*)/.match(args[0]).to_a[1]
  if msg = CGI::parse(query)["text1"][0]
    Thread.start do
      ie.document.getElementById("id1").innerText =
        "#{msg} = #{eval(msg)}"
      ie.document.getElementById("id0").focus
    end
  end
}
puts "IE read \"file://#{file}\""
ie.Navigate("file://#{file}")
sleep 0.1 while ie.readystate != 4
begin
  ie.document.getElementById("id0").focus
  ie.document.getElementById("id0").innerText = 'Math.sqrt(2)'
  loop do
    WIN32OLE_EVENT.message_loop
    sleep 0.05
  end
ensure
  ie.quit
end
-----$ test-event.rb

-----^ test.html
<html>
<head><title>win32ole</title></head>
<body>
<h1>Hello, win32ole!</h1>
<form>
Calc: <input type="text" name="text1" value="" id="id0">
('exit' for quit)
</form>
<pre id="id1"></pre>
</html>
-----$

使い方は

ruby test-event.rb c:/home/sinara/ruby/test.html
                   ^^^^^^ フルパスの方がいいかも

です。リターンを押すたびにリロードするのがちょっと
かっこ悪いですが、結局、IE は、ユーザー・インター
フェースとして使えるか?というと、

  使えそう

ですね。

Windows95 の時代にこれを作っていた助田さんはスゴイ。