extimer.hta // コメント

前回の記事で公開した、時限式コマンド実行アプリ extimer.htaソースコードについて、コメントを記していく。

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

この meta 要素により、mshta.exe の動作モードを IE9 にする。IE10 モードでは、後述の hta:application 要素が動作しないからだ。

<hta:application id="hta"
  applicationname="ExecTimer"
  border="thick"
  borderstyle="normal"
  caption="yes"
  contextmenu="no"
  icon=""
  innerborder="yes"
  maximizebutton="no"
  minimizebutton="yes"
  navigable="no"
  scroll="no"
  scrollflat="no"
  selection="yes"
  showintaskbar="yes"
  singleinstance="no"
  sysmenu="yes"
  version="1.0"
  windowstate="normal"
/>

hta:application 要素は、HTA でのみ効果を発揮する。これを記述すると、ウィンドウのタイトルバーを非表示にしたり、テキスト選択を無効にしたりすることができる。そして、JavaScript から、このノード特有のプロパティ commandLine にアクセスし、コマンドライン引数を取得することができる。たくさんの属性を記述しているが、覚書としての用途が主であり、ほぼすべて省略可能である。

<title>ExecTimer</title>

title 要素には文字列を入れているが、動作モードが IE9 だと、なぜかタイトルバーに反映されない。IE5,6,7,8,10 では反映されるのを確認した。

<p>残り時間: <time id="clock">?</time></p>

残り時間を表示する要素として、HTML5 で導入された time 要素を使用している。

var args = hta.commandLine.match(/(^"[^"]+") ?(\d*) ?([\S\s]*)/);

hta.commandLine で、コマンドライン引数を取得している。この hta とは、hta:application 要素の属性 id="hta" のそれである。

var execCmd = function(cmd) {
  new ActiveXObject("WScript.Shell").exec(cmd);
  setTimeout(function() {
    window.close();
  }, 100);
};

WSH の exec 関数で、コマンドやファイル名を実行する。のち、window.close で extimer.hta を終了するが、100 ミリ秒の待機を経てから行っている。終了するのが早すぎると、exec によって起動したソフトのウィンドウにフォーカスが移らないからだ。

var clockText = document.querySelector("#clock").firstChild;

IE9 にもなると、DOM ノードへの参照を CSS セレクタによって取得できる関数 document.querySelector が使用できる。IE8 から飛躍的に Web 標準度が向上している。

window.resizeTo(320, 31 + document.body.offsetHeight);

コンテンツ表示領域の縦幅が、body 要素の高さと同じになるように、ウィンドウをリサイズしている。31 というマジックナンバーは、タイトルバーやウィンドウ枠のだいたいの合計値である。

cancelbtn.addEventListener("click", function() {
  window.close();
});
addEventListener("keyup", function(e) {
  if (e.key === "Enter" || e.key === "Esc") {
    cancelbtn.click();
  }
});
cancelbtn.focus();

IE9 にもなると、DOM イベントハンドラ登録関数として、IE 独自の attachEvent だけでなく、addEventListener も実装されている。

キャンセルボタンを押すと、タイマーは中断され、extimer.hta が終了するようにしてある。EnterEsc を押しても同じことだ。

extimer.hta 起動時に、キャンセルボタンにフォーカスを移している。このことにより、Spacebar を押すことによってもキャンセルが可能となっている。