1

独自のモーダル ダイアログを実装しようとしました (なぜ? )。次を使用して新しいウィンドウを開きますWScript.Shell

dlg = shell.Run(dlgPath, 1, true);

上記の行は、「セミモーダル」HTA ウィンドウを作成します。スクリプトの実行はこの行で停止しますが、メイン ウィンドウは引き続き応答します。この問題はonfocusin、イベント ハンドラー内で対処されます。イベント ハンドラーは、shell.AppActivate(). これにより、[ウィンドウを閉じる] ボタンでもメイン ウィンドウを閉じることができなくなります。ただし、Windows7 では、メイン ウィンドウを閉じるためのバック ゲート、Windows タスク バーのアイコンがあります。

メイン ウィンドウが閉じている場合は、まともなモーダル ダイアログも閉じる必要があります。この場合、開かれた HTA ウィンドウはメインの実際の子ウィンドウではないため、閉じられません。

以下のメイン ウィンドウのonbeforeunloadハンドラ関数内で、このダイアログ エミュレータを閉じることができます。

beforeTopClose = function () {
    var wmiLocator = new ActiveXObject('WbemScripting.SWbemLocator'),
        wmiService = wmiLocator.ConnectServer('.', 'root\\CIMV2'),
        htas = new Enumerator(wmiService.ExecQuery("Select * from Win32_Process Where name = 'mshta.exe'"));
    while (!htas.atEnd()) {
        if (htas.item().CommandLine.indexOf('_tools\\dlgbase') > -1) {
            htas.item().Terminate(0);
        }
        htas.moveNext();
    }
    return;
}

これですべてが正常に表示され、画面にアプリのウィンドウが残っていません。ただし、Windows タスク マネージャーの [プロセス] タブを開くと、メイン ウィンドウのプロセスがまだ実行されていることがわかります。

メインウィンドウがまだ実行されているのはなぜですか? -プロセスの終了を待っていshellますか? onbeforeunloadメインウィンドウを完全に閉じるには、ハンドラーで何をすべきですか? これとは異なるアプローチが必要な場合は、お知らせください。

4

1 に答える 1

2

でメインウィンドウも終了できることに気付きましたbeforeTopClose()。以下のコードを修正しました。

beforeTopClose = function () {
    var thisHta = {},
        thisHtaPath = lib.shell.currentDirectory + '\\index.hta', // Path to current HTA
        htas = new Enumerator(lib.wmiService.ExecQuery("Select * from Win32_Process Where name = 'mshta.exe'"));
    while (!htas.atEnd()) {
        if (htas.item().CommandLine.indexOf('_tools\\dlgbase') > -1) {
            htas.item().Terminate();
        }
        if (htas.item().CommandLine.indexOf(thisHtaPath) > -1) {
            thisHta = htas.item();
        }
        htas.moveNext();
    }
    thisHta.Terminate();
    return;
}
于 2012-12-29T09:53:53.460 に答える