我试图实现我自己的模式对话框(为什么?)。我使用以下命令打开一个新窗口WScript.Shell
:
dlg = shell.Run(dlgPath, 1, true);
上面的行创建了一个“半模态”HTA 窗口。脚本执行在这一行停止,但主窗口仍然响应。这个问题在onfocusin
eventhandler 中得到解决,它使用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
处理程序中做什么才能完全关闭主窗口?如果我需要不同的方法来解决这个问题,请告诉我。