May 13, 2014

IEのボタンクリックなどのイベントをWSH/VBScriptから監視する

VBScriptでOnclick = …何と書くか

VBScriptを使ってIEに読み込ませたページ上で、ボタンがクリックされた場合に、それを検知するためのコードを示します。 GetRef関数で得られたOnClickSubプロシージャへのポインタをonclickに設定しています。これにより、ボタンがクリックされるとメッセージボックスが表示されます。

設定されたイベントフックはこのスクリプトが動作している間しか機能しませんので、無限ループを回しておき、IEが終了するとともにスクリプトを終了させています。そのため、CreateObject関数では"IE_"としてイベントプレフィックスを設定しており、IEが終了するときに発生するOnQuitイベントを捕捉し、その時にスクリプト自体も終了させています。
MoniteringIEEvent

Sub MoniteringIEEvent
    Set ie = WScript.CreateObject("InternetExplorer.Application", "IE_")

    ie.Navigate "http://www.google.co.jp"
    ie.Visible = True
    waitIE ie

    ie.Document.getElementById("gbqfq").Value = "vbscript DOM event hooking"
    ie.Document.getElementById("gbqfb").onclick = GetRef("OnClickSub")

    Do While True
        Wscript.sleep 1000
    Loop
End Sub

Sub IE_OnQuit
 WScript.Quit
End Sub

Sub OnClickSub()
    MsgBox  "Search button clicked!"
End Sub

Sub waitIE(ie)
    Do While ie.Busy = True Or ie.readystate <> 4
        WScript.Sleep 100
    Loop
    WScript.Sleep 100
End Sub

応用できそうな事例

特定のページで特定のボタンを押すと、本来の動作に加えて独自機能が動く。例えば、検索したときに検索ワードをローカルファイルに記録していくスクリプトが書けるでしょう。これを実現するには、立ち上がっているIEのすべてのプロセスを監視するスクリプトも必要になりますが。

あるいは、スクリプトで起動したwebアプリケーションに対して、人の入力を待ってから次の動作を行う、ということもできるでしょう。例えば、結果を表示して人に選択させるような場面が考えられます。

広い意味でのアドオンを作ることもできるでしょう。あえてWSH/VBScriptで作るべきか、という議論はありますが、インストール不要でダウンロードも実行も容易という点では、環境に依存せず配布しやすいかもしれません。

参考

WScript.CreateObjectはVisual BsssicのCreateObjectと第2引数の意味がまったく違うことに注意です。
GetRef Function
http://msdn.microsoft.com/en-us/library/ekabbe10(v=vs.84).aspx
CreateObject Method
http://msdn.microsoft.com/en-us/library/xzysf6hc(v=vs.84).aspx
Scripting Events
http://msdn.microsoft.com/en-us/library/ms974564.aspx

No comments :

Post a Comment