Flash Desktop Clock

(シンプルな時計)

【Flash Desktop Clock】

簡単なアナログ時計のサンプルです。

このサンプルは以下の内容を含みます
・JavaScriptをメインに用いたHTA
・マウスドラッグによるウィンドウ位置の変更
・ウィンドウ位置情報をファイルに保存

[DOWNLOAD]
サンプルを動かしてみるには解凍して出来る
"clock.hta"をダブルクリックして起動してください


【JavaScriptをメインに用いたHTA】

fscommandではVBScriptのサブルーチンが呼ばれますが、VBScriptからJavaScript(*)の関数を呼び出すようにすれば、以降はすべてJavaScriptで処理することが可能です。JavaScriptからでもWSHのオブジェクトはほとんど同じように使うことができるのでActionScriptに詳しい方はこちらの形のほうが色々と扱いやすいものと思います。

*ActiveXObjectの使用等はMicrosoftの独自拡張であり、正確にはJScriptですがここではまとめてJavaScriptと記述しています。

<script Language="VBScript">
Sub flashClock_FSCommand(ByVal command, ByVal arg)
    // VBScriptでfscommandから受け取った引数をJavaScriptの関数に渡す
    dummy = procFSCommand(command, arg)
End Sub
</script>

<script Language="JavaScript">
function procFSCommand(command, arg) {
    var objWshShell = new ActiveXObject("WScript.Shell");
    objWshShell.Run(arg);
}

</script>


【マウスドラッグによるウィンドウ位置の変更】

マウスドラッグによる位置変更は、HTAにswfムービーが表示されない部分(余白)があればDHTMLで比較的簡単に実装できますが、この場合余白がなくマウスイベントはFlashが全て受け取ってしまうので少し工夫が必要です。このサンプルにおいてはマウスドラッグ操作中はムービー側からfscommandを連続で呼び出し、HTA内でそれを受け取って仮想clickイベントを発生させ、そのイベントハンドラでウィンドウを動かすという多少トリッキーな方法でこれを実現しています。

マウスドラッグ操作を扱うMovieClipのオブジェクトアクション

onClipEvent(mouseDown){
    // マウスドラッグの開始
    bDrag = true;
    // ムービー上でのマウス位置を格納しておく
    mousePos = new Array(_root._xmouse, _root._ymouse);
}

onClipEvent(enterFrame){
    if (bDrag) {
        // ドラッグ中はfscommandを連続で呼び出す
        fscommand("drag", mousePos.join(","));
    }
}

onClipEvent(mouseUp){
    // マウスドラッグの終了
    bDrag = false;
}

HTA内のJavaScript

<div id="objMouseDrag" onclick="dragClock()"></div>

<script Language="JavaScript">

var mousePos = new Array(0, 0);

function
procFSCommand(command, arg) {
    var objWshShell = new ActiveXObject("WScript.Shell");
    switch (command.toLowerCase()) {
        case "drag":
            mousePos = arg.split(",");
            objMouseDrag.click(); // 仮想クリックイベントを発生させる
            break;
        case "quit":
            objWindowPosition.click();
            window.close();
            break;
    }
}

function dragClock() {
    window.moveTo(
        window.event.screenX - mousePos[0],
        window.event.screenY - mousePos[1]
        );
}
</script>


【ウィンドウ位置情報をファイルに保存】

状態保存はHTA終了時にWSHのFileSystemObjectを用いてウィンドウ位置をXMLファイルの形で書き出し、次回起動時にそれを読み取り元の位置に復元するようにしています。

JavaScriptでウィンドウの位置を保存

<body onload="loadWindowPosition()">
<div id="objWindowPos" onclick="saveWindowPosition()"></div>

<script Language="JavaScript">
function saveWindowPosition() {
    // ウィンドウ位置の取得
    var windowX = window.event.screenX - window.event.clientX;
    var windowY = window.event.screenY - window.event.clientY;

    var objFileSystem= new ActiveXObject("Scripting.FileSystemObject");
    // ファイルを開いてデータを書き込む
    var objStream = objFileSystem.CreateTextFile("clock.xml", true);
    objStream.Write("<?xml version=\"1.0\ encoding=\"Shift_JIS\" ?>\n");
    objStream.Write("<position>" + windowX + "," + windowY + "</position>\n");
    objStream.Close();
}

function loadWindowPosition() {
    var objFileSystem= new ActiveXObject("Scripting.FileSystemObject");
   
    // ファイルを開いて全データを読み出す
    var objStream = objFileSystem.OpenTextFile("clock.xml", 1, true);
    strSettings = objStream.ReadAll();
    objStream.Close();

    // 正規表現を使って座標値を読み出す
    var arrayMatch = strSettings.match(/<position>(\d+),(\d+)<\/position>/i);

    //ウィンドウ位置を変更
    if (arrayMatch) {
        window.moveTo(arrayMatch[1], arrayMatch[2]);
    }
}
</script>
</body>