独自のモーダル ダイアログを実装しようとしました (なぜ? )。次を使用して新しいウィンドウを開きます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
メインウィンドウを完全に閉じるには、ハンドラーで何をすべきですか? これとは異なるアプローチが必要な場合は、お知らせください。