VBScriptでGUI
先日VBScriptでGUIプログラムは作れるかと聞かれて、むかーしに、誰かが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
スクリプトを実行すると、こんな画面が表示される。
スクリプト作るときの注意点としては、ボタンを Submit にするとIEの画面遷移が起こってしまうようで入力値が無くなってしまうので、ボタンの type は Button にせざるを得ない・・?
やろうと思えばVBScript内のロジックとして画面遷移を持たせることも出来る。DHTML使って結構リッチなGUIを作りこむことも出来るんだろうけど、まあそこまでやるんだったら普通にVB使ったほうがいいか。