我试图实现自己的模态对话框(Why?)。我使用WScript.Shell
打开一个新窗口:
dlg = shell.Run(dlgPath, 1, true);
上面的行创建了一个“半模式”HTA窗口。脚本执行在此行停止,但主窗口仍然响应。此问题在onfocusin
eventhandler中得到解决,它使用shell.AppActivate()
将焦点返回到新的HTA窗口。这甚至可以防止“关闭窗口”按钮关闭主窗口。但是,在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
处理程序中做什么才能完全关闭主窗口?如果我需要采用不同的方法,请告诉我。
答案 0 :(得分:1)
我刚刚意识到,我也可以在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;
}