VBScriptでGUI

先日VBScriptGUIプログラムは作れるかと聞かれて、むかーしに、誰かがInternetExploreのコントロール使って出来ると言っていたような事を思い出し、ちょこっとトライ。

やり方の流れとしては、


1. IEのオブジェクトを作って表示する


2. IEのオブジェクトにVBScript内で生成したHTMLを食わせる
このとき、食わせるHTMLの中にVBScriptからの状態監視用の変数と、それを操作するコントロールjavascriptを埋め込んで置く。


3. 監視用の変数が終了状態になるのを待つ


4. 必要なら、IEのドキュメントの中身を眺めてユーザーの入力した値を取得する


と言う感じかな。
とりあえず作ってみたユーザーIDとパスワード入力画面を表示するスクリプトは以下のような感じ。


auth.vbs

set w = WScript

' IEのオブジェクトを作り、画面の設定をして、表示
set ie = CreateObject("InternetExplorer.Application")
ie.Width = 300
ie.Height = 150
ie.ToolBar = false
ie.StatusBar = false
ie.Resizable = false
ie.Visible = true
ie.Navigate "about:blank"
do while ie.Busy
  w.sleep 100
loop

' ユーザーIDとパスワードの入力ボックスと、ボタンを表示
html = "" _
+ "<form>" _
+ "  <input type=""hidden"" name=""CLICKED"" value=""false""/>" _
+ "  User ID: <input type=""text"" name=""USERID""/><br/>" _
+ "  Password: <input type=""password"" name=""PASSWD""/><br/>" _
+ "  <input type=""button"" " _
+ "    onClick = ""getElementsByName('CLICKED')(0).value = 'true';""" _
+ "    value=""OK"" />" _
+ "</form>" _

ie.Document.Body.InnerHtml = html
ie.Document.Title = "VBScript GUI test."

' ボタンがクリックされるまで待つ
on error resume next

function is_clicked(ie)
  is_clicked = ie.Document.GetElementsByName("CLICKED")(0).value <> "false"
end function
do while ie.Busy or not is_clicked(ie)
  if Err.Number <> 0 then exit do
  w.sleep 100
loop

' 入力されたユーザー名とパスワードを表示
if Err.Number = 0 then
  userid = ie.Document.GetElementsByName("USERID")(0).value
  passwd = ie.Document.GetElementsByName("PASSWD")(0).value
  ie.Quit
  
  w.echo "Your input userid and password" + vbcrlf + vbcrlf _
         + "userid: " + userid + vbcrlf _
         + "passwd: " + passwd
end if


スクリプトを実行すると、こんな画面が表示される。


OKボタンを押すと、実行結果としてこんな画面を表示する。


スクリプト作るときの注意点としては、ボタンを Submit にするとIEの画面遷移が起こってしまうようで入力値が無くなってしまうので、ボタンの type は Button にせざるを得ない・・?


やろうと思えばVBScript内のロジックとして画面遷移を持たせることも出来る。DHTML使って結構リッチなGUIを作りこむことも出来るんだろうけど、まあそこまでやるんだったら普通にVB使ったほうがいいか。