IE10 の HTA 問題

HTA ファイルの制作をやっている。指定時間経過後に PC をスリープ状態に移行する JScript ファイルの高機能移植版である。現行の JScript 版では、ActiveX オブジェクトの WScript.Shell が提供する popup メソッドを使用して、指定時間経過後に自動的に閉じるダイアログボックスを作成することで、3 分タイマーのような機能を実現しているが、タイマーを開始してからどれくらい時間が経ったのかをリアルタイムに描画することができないのである。そこで、新たに HTA ファイルを制作することにした。

HTA エンジンが古い?

HTA は、通常の HTML と全く同じ文法でつくることができる。Windows 8 には、IE10 が標準でインストールされているが、HTA を実行するエンジン mshta.exe には、JavaScriptObject.keyswindow.addEventListener などが、なぜか存在しない。このことから、mshta.exe は、IE8 以下のモードで動いているように見える。ただ、mshta.exe のファイル プロパティで、ファイル バージョンが 10.0.9200.16384 となっていることからして、IE10 であることには変わりなさそうだ。

最新モードに設定してみる

Microsoft の 開発者向け技術情報サイト MSDN には、"X-UA-Compatible" という値についての説明がある。これは、HTML の meta 要素の http-equiv 属性に入れる値であり、content 属性のほうには例えば "IE=9" などと記述することで、IE9 互換モードでサイトがレンダリングされる。

<meta http-equiv="X-UA-Compatible" content="IE=9" />

HTA においても、この方法が通用するか試しに、最新のモードを適用する content="IE=edge" を指定してみたら、Object.keys は使用できるようになったものの、なぜか、hta:application 要素の commandLine プロパティが正常に取得できなくなってしまった。

妥協するしかない

これは一体どういうことなのかを Web で検索した結果、Microsoft による回答が得られた。すなわち、hta:application を始めとする、タグ記述による制御方法は、Web 標準的でないので、削除したとのことだ。

IE10 の環境で、モダンな JavaScript コードが使用でき、コマンドライン引数を取得できる HTA ファイルを制作するなら、content="IE=9" を使用するのが最も良い。