Programming」さんのWindowsアプリからWScript.exeのWScriptオブジェクトを利用するをとりあえず試してみた。頭の中にあったのが「WScriptオブジェクトをHTAに渡せば、HTAからグローバルメンバにアクセスできるぜ。へへへ」てなことだったのだが、なんかイマイチうまくいかなかった。thisはfalseになるので無理だったのだが、それがわかるまで結構ハマった。IEを経由させるのはWScriptではなくthisにするようにしてみた。他にも型のチェックとかで元のコードを単純に移行しても動かなかったのと、もらったWScriptからWshShellを作成してPopup叩いてもイマイチ面白くないので、HTAからWScript.EchoとWScript.StdIn.ReadLineを試してみるようにした。作ってみたコードまずjs側。名前を「wsh.js」とする。);そんでこっちがHTA側。名前はなんでもいいけど「test.hta」とかにしておく。wsh.jsからプロパティがセットされるとundefinedではなくなる。ws.readln("なんか入力すれ。);</script></html>IEに設定するプロパティ名が「WScript」になっているが、wsh.jsでセットしているオブジェクトはWScriptではなく、グローバルコードでの「this」になるので注意。test.htaとwsh.jsを同じところに配置してtest.htaを起動すると、コンソール(cscript.exe)が起動して、1秒間隔で10回時間を表示するコンソールで入力を求められるHTA側でコンソールで入力された文字をalertして終了コンソール側もメッセージを表示して終了となる。簡単なライブラリ化をしてjsからHTAをダイアログのように使うのも試してみたので次のエントリで。22時25分18秒こんなエントリやこんなエントリを読んで漠然と思った。XULRunnerのときも思ったが「これってHTAじゃね?」という感じがする。Ajaxではなく「DHTML」といっていたころ(いまも言うのか)にJ(ava)Scriptにハマっていた人はおんなじようなことを感じてるんじゃなかろうか。後発だけあって、セキュリティ周りとか低レベルのアクセスを行う機能とかはまともな設計をしている(と思いたい)だろうけど、実行可能な機能としてApolloでできることは大体HTAでもできるような気がする。Win限定ってのがアレだもんで、マルチプラットフォームなXULやApolloと比べるのはお門違いなんだけどさ。(あー、なによりSilverlightがあったか)でもWindowsならわざわざランタイムインストールしなくても動作するってのは大きいと思う。ファイルIOだってDBアクセスだって大体のコンポーネントはOSで持ってるしね。あとは関連ファイルを1つのアーカイブにまとめて実行できる機能でもあればいいなぁ。.zipをmshtaに渡すとアーカイブ中の「main.hta」をキックして、とかね。res://~ってできるんだけど、Win32アプリをビルドできる環境が必要になるしなぁ)あと、MSがHTA(というかIE)向けの高度なUIコンポーネント(HTCベースでかまわない)でもOSに入れといてくれれば結構しっかりしたアプリケーションができるんだけど、もはやテコ入れはないだろうなぁ。そんな取りとめもないことを思ったり思わなかったり。あー、ApolloでDBアクセスって話でてるけど、ひょっとしてASで直接ソケット接続するクライアントを作るってのかな?ODBCサポートでもすればいいのに。01時20分20秒アプリっぽくなる以前HTAコネタで起動時に位置とサイズを設定するTIPS(てほどでもないが)を紹介したが、それにちょっとひねりを加えて、自動的に位置とサイズを記憶、次回自動時にそれを再現するサンプルを書いてみる。なんとなく、デスクトップアプリっぽいしょ?なお、サンプルでは、矩形情報の読み込み・保存にjson.orgのJSONライブラリを利用しているが、単純なシリアライズ・デシリアライズなので自前でメソッドを用意できるなら特にjson.jsは必要ない。処理のタイミングまず、前のエントリでも書いたが、ウィンドウの位置とサイズを設定するタイミングは、HTA:APPLICATIONタグの出現前にしないと気になるちらつきが発生する。json.jsをロード(または同等の機能の定義・ロード)してからhta:applicationが出現するまでに保存したウィンドウ矩形情報のロードロードした矩形情報を元にリサイズと位置の確定の処理をする必要がある。最終的な矩形情報の保存のタイミングだが、後述の通りdocument.bodyのプロパティを参照するので、window.onbeforeunloadにする。onunloadではdocument.bodyへアクセスできないためエラーになる。面倒なのは、ウィンドウの位置とサイズの正確な取得方法だ。IEにはwindow.screenLeft/screenTopというプロパティがあるが、これはウィンドウボーダーとタイトルバーのサイズを除いた情報しか取得できない。サイズについてはdocument.bodyのoffsetWidth/offsetHeightが取得可能なもっとも外側のサイズのようで、これまたタイトルバーやらとの差がある。するかというと起動直後に位置とサイズを調整するのだからその情報を元に、document.bodyのレンダリングがすんだ時点で差分を取得しておく。保存時はその差分を加えた情報を保存する。いう、ややベタな方法をとることにする。プロパティに、測定サイズと実サイズの差を格納する。savePrefは指定オブジェクトのJSONデータを保存する関数。offsetRectの補正値を加える。);の要領で補正した矩形情報を保存する。サンプルコード実際に位置とサイズを自動保存するHTAのサンプルコードは以下のとおり。);}</script></html>まあ、こんな機能なくてもいいんだけど、ちょっとデスクトップアプリ気分に浸れるので。起動時に位置とサイズを指定HTAのウィンドウが表示されるタイミングはhta:application要素が出現した時なので、これより前にwindow.resizeTo/moveToで位置と要素を指定できる。scroll="no"></hta:application></head><body></body></html>上のコードで、hta:applicationをscriptより前に記述すると、一瞬表示された後にセンタリングされる。hta:applicationを使用しなければこんなことに気を使わなくてもいいんだけど。.htaにファイルをドラッグドロップできるようにする割と定番だとおもうが、htafileにDropHandlerを登録すると、.htaのアイコンにファイルをドラッグドロップできるようになる。DropHandlerの登録はHKEY_CLASSES_ROOT\htafile\ShellEx\DropHandlerの標準の値に、文字列で{60254CA5-953B-11CF-8C96-00AA00B8708C}を設定する。以下の内容を.regファイルとして保存すれば登録できる(ハズ)。5.00[HKEY_CLASSES_ROOT\htafile\ShellEx\DropHandler]@="{60254CA5-953B-11CF-8C96-00AA00B8708C}"ドラッグドロップされたパラメータを受け取るには、htaオブジェクトのcommandLineプロパティを使用する。commandLineプロパティには、mshta.exeを実行した際のコマンドライン引数がそのまま格納されているので、パースする必要がある。=document.getElementById("hta1").commandLine;</script></html>この例では、textareaにこのHTA自身の絶対パスが表示される。.htaにファイルをドラッグドロップして起動した場合はこの後ろにドロップされたファイルのパスが続くことになる。")というわけにはいかないので注意。吊ブックマークレットtumblrのキーボードショートカットが便利になっとる。Chrome編dataスキームの画像をブロックしてみるローカルストレージを確認したり消したりするブックマークレットそうそう、いまさらTwitter始めました。(9)このブログについてJavaScriptとかC#とかPHPとか。