1

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

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

上面的行创建了一个“半模态”HTA 窗口。脚本执行在这一行停止,但主窗口仍然响应。这个问题在onfocusineventhandler 中得到解决,它使用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处理程序中做什么才能完全关闭主窗口?如果我需要不同的方法来解决这个问题,请告诉我。

4

1 回答 1

2

我刚刚意识到,我也可以在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;
}
于 2012-12-29T09:53:53.460 回答