如何从另一个HTA关闭HTA窗口?

时间:2012-12-26 15:23:53

标签: jscript hta activexobject

我试图实现自己的模态对话框(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处理程序中做什么才能完全关闭主窗口?如果我需要采用不同的方法,请告诉我。

1 个答案:

答案 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;
}