如何从另一个HTA关闭HTA窗口?(How to close a HTA window from a

2019-07-17 14:43发布

我试图实现自己的模态对话框( 为什么? )。 我打开使用一个新的窗口WScript.Shell

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

上面的行创建了一个“半模式” HTA窗口。 该脚本执行停止在这条线,但主窗口仍然响应。 这一问题已被解决内onfocusin事件处理程序,它返回焦点回到使用新的HTA窗口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任务管理器进程-Tab,我可以看到在主窗口的过程仍在运行。

为什么主窗口仍在运行? 难道是等待年底shell -方法? 我应该怎么做在onbeforeunload处理程序来获取主窗口完全关闭? 如果我需要一个不同的方法来此,请让我知道。

Answer 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;
}


文章来源: How to close a HTA window from another HTA?