Jak zamknąć okno HTA z innej aplikacji HTA?

Próbowałem zaimplementować własne okna dialogowe modalne (Czemu?). Otwieram nowe okno za pomocąWScript.Shell:

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

Powyższa linia tworzy „półmodalne” okno HTA. Wykonywanie skryptu jest zatrzymywane w tej linii, ale główne okno nadal odpowiada. Ten problem został rozwiązany w ramachonfocusin Eventhandler, który zwraca fokus z powrotem do nowego okna HTA za pomocąshell.AppActivate(). Zapobiega to nawet zamknięciu okna głównego za pomocą przycisku „Zamknij okno”. Jednak w Windows7 znajduje się tylna brama do zamknięcia głównego okna, ikona na pasku zadań Windows.

Jeśli główne okno jest zamknięte, należy również zamknąć porządne okno modalne. W tym przypadku nie jest on zamknięty, ponieważ otwarte okno HTA nie jest prawdziwym oknem potomnym głównego.

Mogę zamknąć ten emulator okna dialogowego w oknie głównymonbeforeunload funkcja obsługi poniżej.

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

Teraz wszystko wygląda dobrze, na ekranie nie ma okien mojej aplikacji. Jednak po otwarciu procesów Menedżera zadań systemu Windows -tab widzę procesgłówne okno nadal biegnie.

Dlaczego główne okno nadal działa? Czy to czeka na koniecshell-proces? Co powinienem zrobić?onbeforeunload obsługi, aby całkowicie zamknąć główne okno? Jeśli potrzebuję innego podejścia do tego, daj mi znać.

questionAnswers(1)

yourAnswerToTheQuestion