Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > win32oleライブラリ > WIN32OLE_EVENTクラス
クラスの継承リスト: WIN32OLE_EVENT < Object < Kernel
OLEオートメーションサーバからのイベント通知を制御するクラスです。
OLEオートメーションサーバによっては、サーバの処理の過程でクライアントが あらかじめ登録したメソッドを呼び出すものがあります。このサーバが登録し たメソッドを呼び出す動作を「イベント」と呼びます。WIN32OLE_EVENTを利用 すると、ブロックの形式でイベントを受け取るメソッドをサーバへ登録できま す。
ie = WIN32OLE.new('InternetExplorer.Application.1')
event = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
b = false
event.on_event('DocumentComplete') do |disp, uri|
disp.document.getElementsByTagName('a').each do |e|
puts "#{e.innerHTML}=#{e.href}" #=> ダウンロード=http://www.ruby-lang.org/ja/downloads/ など
end
disp.quit
b = true
end
ie.Navigate2 'http://www.ruby-lang.org/ja/'
loop do
break if b
WIN32OLE_EVENT.message_loop
end
message_loop -> ()[permalink][rdoc]Windowsのメッセージポンプを実行します。
message_loopメソッドは、Windowsメッセージがキューイングされている限りメッ セージの読み出しとディスパッチを実行します。
COMのスレッド間/プロセス間通信はスレッド内で呼び出しをシリアライズする ためにWindowsメッセージを利用します。このため、ほとんどのイベント処理は Windowsメッセージを読み取ってディスパッチすることで通知されます。
ie = WIN32OLE.new('InternetExplorer.Application.1')
event = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
b = false
event.on_event('DocumentComplete') do |disp, uri|
disp.document.getElementsByTagName('a').each do |e|
puts "#{e.innerHTML}=#{e.href}" #=> ダウンロード=http://www.ruby-lang.org/ja/downloads/ など
end
disp.quit
b = true
end
ie.Navigate2 'http://www.ruby-lang.org/ja/'
loop do
break if b
WIN32OLE_EVENT.message_loop
end
なお、メソッド名はloopですが、呼び出し時および既にキューイングされたメッ セージの処理中にキューされたメッセージの処理が終わると呼び出し元に制御 が戻ります。このため、イベント通知までに長い時間がかかる場合はすべての イベントを受信するまでループを実行する必要があります。このとき他のスレッ ドに制御を与える必要があれば、Kernel.#sleepなどを呼び出してくださ い。message_loopメソッドの呼び出し中はRubyのスレッドの切り替えは行われ ません。
new(ole, event = nil) -> WIN32OLE_EVENT[permalink][rdoc]OLEオートメーションサーバのイベント受信機構をオブジェクト化して返します。
newメソッドは、OLEオートメーションサーバがイベント通知に利用するインター フェイスを取得し、オブジェクトとして返します。
以下の3例はいずれも同等です。
デフォルトイベントインターフェイスを指定した例
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie)
インターフェイス名を指定した例
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
IIDを指定した例
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie, '{34A715A0-6587-11D0-924A-0020AFC7AC4D}')
on_event(event = nil) {|*args| ... } -> ()[permalink][rdoc]イベント通知を受けるブロックを登録します。
引数にはイベントのメソッド名を指定します。引数を省略した場合は、すべて のイベントを対象とするブロックの登録となります。
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
ev.on_event("NavigateComplete2") do |browser, url|
puts url
end
同じオブジェクトに対してeventパラメータを指定したブロックと指定しないブ ロックが混在している場合、通知されたイベントに対応するブロックがあれば そちらだけが呼び出されます。
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
ev.on_event("NavigateComplete2") do |browser, url|
puts url
end
ev.on_event do |*args| # <- NavigateComplete2イベント時は実行されない
puts args[0]
end
...
当メソッドはイベント名の大文字小文字を区別するほか、イベント名の存在確 認を行いません。このため、誤ったイベント名を記述してもエラーとはならず、 単にイベントを受け取れなくなります。
on_event_with_outargs(event = nil) {|*args| ... } -> ()[permalink][rdoc]イベント通知を受けて結果を呼び出し元へ返すブロックを登録します。
引数にはイベントのメソッド名を指定します。引数を省略した場合は、すべて のイベントを対象とするブロックの登録となります。
WIN32OLE_EVENT#on_eventと異なり、イベントのブロック変数に戻り値を 設定できます。
ie = WIN32OLE.new('InternetExplorer.Application')
ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents2')
ev.on_event('BeforeNavigate2') do |*args|
args[6] = true unless args[4] # Cancel = true unless PostData
end
当メソッドはイベント名の大文字小文字を区別するほか、イベント名の存在確 認を行いません。このため、誤ったイベント名を記述してもエラーとはならず、 単にイベントを受け取れなくなります。