1 (изменено: JSmаn, 2010-04-10 00:29:05)

Тема: WSH: создание окна, а также трансляция 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; 
    width = Number(width) || 400;
    height = Number(height) || 300;
    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 about:"+CodeForLinking);

    outer: for (var t=0; t<1000; t++)
    inner:  for (var i=ShellWindows.Count; --i>=0;) 
    {try{if(ShellWindows.Item(i).id == ID){window=ShellWindows.Item(i).parent.parentWindow;break outer;}}catch(e) {}
    WScript.Sleep(10);}
    
    try {
        window.document.open(); window.Host = Host; 
        window.document.write([content||"", "<script language='JScript'>eval;resizeTo(",width,",", height,"); moveTo(", Number(x) ||  (window.screen.width - width) / 2,",", Number(y) || (window.screen.height - height) / 2, ");</script>"].join(""));
        window.document.close();
    } 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 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);
}

Не советую использовать document.open().