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ć.