Тема: JScript: Создание окна, а также трансляция WScript в HTA
Динамическое формирование окна
Функция CreateWindow создает окно HTA и возвращает ссылку на объект window.
CreateWindow(content, x, y, width, height)
Параметры:
content — необязательный. Строковой параметр. Содержит HTML-разметку окна HTA. По умолчанию "".
x — необязательный. Отступ слева. По умолчанию 0.
y — необязательный. Отступ сверху. По умолчанию 0.
width — необязательный. Ширина окна. По умолчанию 400.
height — необязательный. Высота окна. По умолчанию 300.Пример использования:
var content = "<hta:application showintaskbar=no><title>Sample</title>", window = CreateWindow(content);
Для удобства хранения HTML кода Вы можете использовать WSF.
Код функции:
function CreateWindow(content, x, y, width, height) { var HTASettings = "", e, window, Host = this; try {HTASettings = content.match(/<hta[^>]+>/gim)[0].replace(/\r?\n/g, " ").replace(/"/g,"'")} catch (e){}; var ID = (new Date).valueOf(), CodeForLinking = "\"<title> </title><script>moveTo(-300,-300); resizeTo(0,0)</script>"+HTASettings+"<object id="+ID+" classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object>\"", ShellWindows=(new ActiveXObject("Shell.Application")).Windows(), NumberOfWindows = ShellWindows.Count; (new ActiveXObject("WScript.Shell")).Run("mshta.exe javascript:"+CodeForLinking); while (NumberOfWindows==ShellWindows.Count) {WScript.Sleep(10);} for (var i=ShellWindows.Count; --i>=0;) try { if (ShellWindows.Item(i).id == ID) window = ShellWindows.Item(i).parent.parentWindow; } catch (e) {} try { window.document.open(); window.Host = Host; window.document.write([content||"", "<script language='JScript' id=\"a",ID,"\">eval; moveTo(", Number(x) || 0,",", Number(y) || 0, "); resizeTo(", Number(width) || 400,",", Number(height) || 300,"); document.getElementById(\"a",ID,"\").removeNode();","</script>"].join("")); } catch (e) {return} return window; }
Трансляция WScript в окно HTA осуществляется автоматически. Этот объект будет доступен после того как будет построено дерево элементов полностью. Доступ к объекту осуществляется так: window.Host.WScript. Host — это ссылка на Global Object среды WSH.
Особенности функции:
1. Маленький объем кода.
2. Используются встроенные возможности Windows.
3. Окно доступно только тому скрипту, который его создал.
4. Не требуется создание временных файлов.
5. Не используется для связки Internet Explorer.
Эта идея может упростить решения задач, которые обсуждались в темах:
1. VBScript: конструирование и выдача диалогов с помощью HTA
2. JScript: динамическое формирование окна HTA
3. WSH: трансляция объекта WScript
4. HTA: использование WScript.Sleep()
5. VBScript: COM-сервер для управления окнами HTA
Также Вам может пригодиться функция CloseWindowOnQuit. Она закрывает указанное окно по окончанию работы скрипта, а также WaitWindow — ожидание закрытия окна.
function CloseWindowOnQuit(window) { window.eval("setInterval('var e;try{Host.WScript}catch(e){close()}',100)"); } function WaitWindow(window) { while ((typeof window.document)=="object") WScript.Sleep(10); } var HTMLObject = new ActiveXObject("HTMLFile").parentWindow; function WaitWindowAsync(wnd, callback) { var id = HTMLObject.setInterval(function () {if ((typeof wnd.document)!="object") {HTMLObject.clearInterval(id); callback(wnd)}}, 10) }
Пример использования:
var window = CreateWindow("<hta:application showintaskbar=no><title>Sample</title>"); CloseWindowOnQuit(window); WScript.Sleep(4000);
Функция CreateWindowFromFile поможет Вам заменить WshShell.Run("mshta.exe"+Path).
function CreateWindowFromFile(Path, x, y, width, height) { var content = (new ActiveXObject("Scripting.FileSystemObject")).GetFile(Path).OpenAsTextStream(1).ReadAll(); return CreateWindow(content, x, y, width, height); }