1 (изменено: dab00, 2012-01-06 19:20:18)

Тема: HTA: COM-сервер для HTA

Уважаемые формучане. По мотивам общения на форуме появилась идея написать библиотеку по теме: "Все, что я хотел от HTA, но боялся спросить" .
На текуший момент с помощью библиотеки можно:
- создавать, изменять, удалять иконку приложения в трее и всплывающую подсказку к ней
- изменять размер и отображение окна, делать окно приложения поверх всех
- получать дескриптор окна (как же без него)
Работа с иконкой: щелчок правой кнопкой мыши скрывает окно приложения, левой - открывает, двойной щелчок левой кнопкой мыши делает окно приложения поверх всех, двойной щелчок правой - отменяет поверх всех.
Что получилось на текущий момент - на скриншоте. Скачать можно здесь. В архиве: библиотека, HTA и пара иконок для теста.
http://da440dil.narod.ru/other-images/DAHTACOM1.png
Исходный код HTA - наглядная демонстрация методов COM-объекта, а также приемов работы с библиотекой:

<html>
<head>
  <title>DAHTACOM</title>
  <HTA:APPLICATION 
    ID = "DAHTACOM"
    APPLICATIONNAME="DAHTACOM"    
    SINGLEINSTANCE="yes"
    MAXIMIZEBUTTON = "no"
    SCROLL="no"
    ShowInTaskbar ="no"
    BORDER="none"
    SELECTION="no"
    Version = "1.0">
    </HTA:APPLICATION>
</head>
<style type="text/css">    
    html, body{
        margin:0;
        padding:0;
        width:100%;
        height:100%;
        background-color:66ff99;
    }
    #txt{
        color:#fff;
        background-color:009999;        
        text-align: center;
        font:bold 28 sans-serif;
        width:350px;
        height:310px;
        position:absolute;
        top:50%;
        left:50%;
        margin:-155px 0 0 -175px;
    }
 </style>
<script language="VBScript">
    On Error Resume Next
    Const LibName = "DAHTACOM.dll"
    Const IconName = "daffodil-16x16-256.ico"    
    Const TipText = "Всплывающая подсказка"
    Const NewTipText = "Новая подсказка"
    
    Dim x0, y0

    Set wshShell = CreateObject("WScript.Shell")
    
    'копируем библиотеку в католог Windows
    'если копирование не удастся - библиотека зарегистрируется из текущего каталога
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(wshShell.CurrentDirectory & "\" & LibName) Then
        fso.CopyFile wshShell.CurrentDirectory & "\" & LibName, _
                fso.GetSpecialFolder(0) & "\" & LibName, True
    Else
        MsgBox "Не найден файл " & strDll,vbExclamation,"Ошибка"
        window.close
    End If    
    
    'пытаемся зарегистрировать библиотеку
    intRet = RegLib(True)
    If intRet Then        
        Set objDAHTA = CreateObject("DAHTACOM.DAHTAClass")
        'в случае регистрации библиотеки из текущего каталога - работы portable
        'иногда вылетает ошибка - экземпляр класса создается не с первого раза
        If Err.Number <> 0 Then window.close
        'создаем иконку
        objDAHTA.AddIcon document.title, IconName, TipText, True
    Else
        MsgBox "Не удалось зарегистрировать библиотеку " & strDll,vbExclamation,"Ошибка"
        window.close
    End If    
        
    Sub Window_OnLoad()
        SetUpEventHandler()        
    End Sub
    
    Sub Window_OnUnload()        
        objDAHTA.DelIcon 'удаляем иконку
        Set objDAHTA = Nothing        
        intRet = RegLib(False)
        Set fso = Nothing
        Set wshShell = Nothing
        window.close
    End Sub
    
    'регистрация библиотеки, True - регистрируем, False - разрегистрируем
    Function RegLib(bReg)
        Dim strReg
        If bReg Then 
            strReg = "regsvr32.exe /i /s "
        Else
            strReg = "regsvr32.exe u/ /i /s "
        End If        
        intRet = wshShell.Run(strReg & LibName)        
        If intRet = 0 Then 'если удалось зарегистрировать - True
            RegLib = True
        Else
            RegLib = False
        End If    
    End Function
            
    Sub SetUpEventHandler()        
        
        Set EHMouseDown = GetRef("MouseDownEvent")
        Set EHMouseMove = GetRef("MouseMoveEvent")        
        document.attachEvent "onmousedown", EHMouseDown
        document.attachEvent "onmousemove", EHMouseMove
        
        Set MouseOverClose = GetRef("MouseOverCloseSub")
        closetxt.attachEvent "onmouseover", MouseOverClose
        Set CloseOnclick = GetRef("OnClickCloseSub")
        closetxt.attachEvent "onclick", CloseOnclick
        
        Set MaxOnclick = GetRef("OnClickMaxSub")
        maxtxt.attachEvent "onclick", MaxOnclick        
        Set MouseOverMax = GetRef("MouseOverMaxSub")
        maxtxt.attachEvent "onmouseover", MouseOverMax
        
        Set MouseOverRestore = GetRef("MouseOverRestoreSub")
        restoretxt.attachEvent "onmouseover", MouseOverRestore
        Set RestoreOnclick = GetRef("OnClickRestoreSub")
        restoretxt.attachEvent "onclick", RestoreOnclick
        
        Set MouseOverHide = GetRef("MouseOverHideSub")
        hidetxt.attachEvent "onmouseover", MouseOverHide
        Set HideOnclick = GetRef("OnClickHideSub")
        hidetxt.attachEvent "onclick", HideOnclick
        
        Set MouseOverMin = GetRef("MouseOverMinSub")
        mintxt.attachEvent "onmouseover", MouseOverMin
        Set MinOnclick = GetRef("OnClickMinSub")
        mintxt.attachEvent "onclick", MinOnclick
        
        Set MouseOverSetTop = GetRef("MouseOverSetTopSub")
        settoptxt.attachEvent "onmouseover", MouseOverSetTop
        Set SetTopOnclick = GetRef("OnClickSetTopSub")
        settoptxt.attachEvent "onclick", SetTopOnclick
        
        Set MouseOverUnSetTop = GetRef("MouseOverUnSetTopSub")
        unsettoptxt.attachEvent "onmouseover", MouseOverUnSetTop
        Set UnSetTopOnclick = GetRef("OnClickUnSetTopSub")
        unsettoptxt.attachEvent "onclick", UnSetTopOnclick
        
        Set MouseOverHandle = GetRef("MouseOverHandleSub")
        handletxt.attachEvent "onmouseover", MouseOverHandle
        Set HandleOnclick = GetRef("OnClickHandleSub")
        handletxt.attachEvent "onclick", HandleOnclick
        
        Set MouseOverModIcon = GetRef("MouseOverModIconSub")
        modicontxt.attachEvent "onmouseover", MouseOverModIcon
        Set ModIconOnclick = GetRef("OnClickModIconSub")
        modicontxt.attachEvent "onclick", ModIconOnclick
        
    End Sub
    
    Function MouseDownEvent()
        '1 - левая кнопка, 4 - средняя, 2 - правая
        If window.event.button = 2 Then            
            x0=window.event.x
            y0=window.event.y            
        End If
    End Function
    
    Function MouseMoveEvent()
        If window.event.button = 2 Then 'если нажата правая кнопка                    
            window.moveBy window.event.x-x0, window.event.y-y0
        End If
    End Function
    
    Sub MouseOverCloseSub()
        closetxt.Style.Cursor = "hand"            
    End Sub
    
    Sub MouseOverMaxSub()
        maxtxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickCloseSub()        
        Window_OnUnload
    End Sub
    
    Sub OnClickMaxSub()
        objDAHTA.MaxWnd document.title
    End Sub
    
    Sub OnClickRestoreSub()
        objDAHTA.RestoreWnd document.title
    End Sub
    
    Sub MouseOverRestoreSub()
        restoretxt.Style.Cursor = "hand"
    End Sub
    
    Sub MouseOverHideSub()
        hidetxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickHideSub()
        objDAHTA.HideWnd document.title
    End Sub
    
    Sub MouseOverMinSub()
        mintxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickMinSub()
        objDAHTA.MinWnd document.title
    End Sub    
    
    Sub MouseOverSetTopSub()
        settoptxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickSetTopSub()
        objDAHTA.SetTop document.title
    End Sub
    
    Sub MouseOverUnSetTopSub()
        unsettoptxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickUnSetTopSub()
        objDAHTA.UnSetTop document.title
    End Sub
    
    Sub MouseOverHandleSub()
        handletxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickHandleSub()
        MsgBox objDAHTA.GetHandle(document.title)
    End Sub
        
    Sub MouseOverModIconSub()
        modicontxt.Style.Cursor = "hand"
    End Sub
    
    Sub OnClickModIconSub()
        mesaga = InputBox("Введите имя файла новой иконки",,"warn-16x16-256.ico")        
        If fso.FileExists(wshShell.CurrentDirectory & "\" & mesaga) Then
            objDAHTA.AddIcon document.title, mesaga, NewTipText, False
        End If
    End Sub
    
</script> 
<body>
    <div id="txt">
        <div id="modicontxt">Изменить иконку</div>
        <div id="handletxt">Дескриптор окна</div>        
        <div id="maxtxt">Во весь экран</div>                
        <div id="restoretxt">Нормальный размер</div>
        <div id="settoptxt">Поверх всех окон</div>
        <div id="unsettoptxt">Отменить поверх всех</div>
        <div id="mintxt">Свернуть</div>
        <div id="hidetxt">Скрыть</div>
        <div id="closetxt">Закрыть</div>
    </div>    
</body> 
</html>

Приглашаю всех, кого заинтересовала тема, тестировать библиотеку, вносить предложения по расширению функционала и просто высказывать свое мнение.
А что Вы хотите от HTA, но не можете получить?

2

Re: HTA: COM-сервер для HTA

Очень интересная разработка. Не хватает работы с многослойными окнами. Эх, вспоминаю 2007, старый проектик. Хотите посмотреть? Там как раз реализована поддержка многослойных окон.

3

Re: HTA: COM-сервер для HTA

JSman пишет:

Очень интересная разработка.

Хотелось бы позиционировать эту разработку как инструмент разработчика HTA. Это так назыаемый APIWrapper. Только проще, понятнее (надеюсь).
А Вы даже не попробовали. Скачайте, попробуйте. Если для Вас иконку HTML-приложения закинуть в трей - в порядке вещей..., зря я замутил эту тему.

JSman пишет:

Не хватает работы с многослойными окнами.

Не очень понимаю, что такое многослойные окна, наверное как в Вашем приложении, а для реализации надо API? Подскажите, добавим в библиотеку необходимые функции.

JSman пишет:

Эх, вспоминаю 2007, старый проектик.

Очень Красивое Решение. Респектую. Я так не умею.
EXE - это SFX? Куда распаковывается? Посмотреть бы исходники. Java? А этот проектик имеет отношение к HTA?
Сорри, не понял как Вы это нарисовали, выглядит супер.

4

Re: HTA: COM-сервер для HTA

Что касается многослойных окон (Layered Windows), то я имел в виду использование WinAPI-функции UpdateLayeredWindow.

Копипаста с хабра:

В Windows API есть несколько функций при помощи, которых можно создавать «неправильные» окна, такие как: CreateEllipticRgn, CreateRectRgn, CreatePolygonRgn, CreateRoundRectRgn, CombineRgn и др., но при работе с этими функциями выявляется ряд недостатков, окна получаются угловатые, косые края имеют неприятные зубчики, невозможно сделать полноценную тень, да и написание кода создающего окно сложной формы порой требует немало усилий.
Начиная с Windows 2000, у окон появился расширенный стиль WS_EX_LAYERED, делающий окно многослойным, а так же было добавлено несколько API функций по работе с такими окнами, одна из которых UpdateLayeredWindow отвечающая за обновление положения, размера, формы, содержимого и прозрачности многослойного окна. Данная функция позволяет создать окно на основе изображения, в том числе PNG, с учетом альфа канала. Создание формы окна на основе заранее подготовленного изображения гораздо удобнее и легче чем работать с регионами, но и у этого метода есть свой недостаток. На многослойном окне невозможно, простым путем, отобразить какие либо компоненты, такие как кнопки, текстовые поля и др., это является следствием того, что операционная система берет на себя весь процесс перерисовки окна, и стандартное сообщение WM_PAINT окну более не отсылается.

Что касается моего примера, то тут дело обстоит так:
При запуске EXE файлы распаковываются во временную папку. Среди временных файлов Exe-приложение, а также HTA с ресурсами.
1) Сначала осуществляется запуск exe-приложения.
2) Exe-приложение создает многослойное окно, отрисовывает PNG картинку. Далее запускает HTA в скрытом режиме. Во избежание мерцания.
3) При запуске HTA EXE ловит хендл окна, отображает его в соответствии с требуемым позиционированием (координатами и позицией окна).
4) Прямоугольник окна HTA располагается над многослойным окном EXE, поэтому создается иллюзия отображения одного окна. 
5) Exe программа постоянно следит за положение HTA. Поэтому при перемещении HTA-окна или EXE-окна должно сохраняться их относительное позиционирование.

Однако, в то время я писал в среде Дельфи на чистом WinApi из-за того, что я был маниакальным приверженцем крохотного размера программ и не имел опыта в программировании на VB6. Исходя из этого, реализовать ком-архитектуру было очень сложно с моими пожеланиями. Вот поэтому и получился такой большой костыль в виде отдельного EXE приложения.

Таким образом, если идея развития этого направления Вам и иным участникам форума по душе, то хочу выразить свои мысли относительно решения этой проблемы через ActiveX на VB6. Я думаю, что целесообразно создавать многослойное окно через ActiveX, встроенный в HTA. Также можно вести мониторинг относительного позиционирования двух окон и так далее. А если к  событиям можно будет привязать обработчики, то буду очень рад.

5

Re: HTA: COM-сервер для HTA

Вот пример реализации многослойных окон в VB 6.

6 (изменено: dab00, 2011-09-11 12:58:50)

Re: HTA: COM-сервер для HTA

Добавил установку прозрачности окна:
http://da440dil.narod.ru/other-images/DAHTACOM3.png
WS_EX_LAYERED имеет место быть , курю на счет относительного позиционирования
Текущую версию качаем здесь.

7

Re: HTA: COM-сервер для HTA

Мне очень понравилось. Не могли бы направить исходники компонента? Может быть я тоже внесу лепту?

8

Re: HTA: COM-сервер для HTA

JSman пишет:

Не могли бы направить исходники компонента?

Чуть позже. Добавлю относительное позиционирование (уже представляю как - не сложно), сформулирую, как я себе это (позиционирование) представляю человеческими словами и отправлю Вам на e-mail исходники. ОК?

9

Re: HTA: COM-сервер для HTA

Договорились :-)

10 (изменено: dab00, 2011-09-17 09:24:33)

Re: HTA: COM-сервер для HTA

Добавил возможность установки прозрачности по цвету:
http://da440dil.narod.ru/other-images/DAHTACOM4.png
Для многослойных окон - вещь необходимая.
О позиционировании. Добавил пару методов - установка позиции и размера окна (на скриншоте).
Как и другие методы они принимают в качестве аргумента заголовок окна, т.к. дескриптор окна мы получаем по заголовку. Следовательно, необходимо по-разному обозвать окна для однозначной идентификации, и, зная заголовки всех окон многослойного приложения, можно непосредственно из скрипта перемещать другие слои/изменять размер вслед за основным/видимым.
Текущая версия здесь.
Время будет - займусь "неправильными" окнами. Кому-нибудь, кроме JSman интересно?

11

Re: HTA: COM-сервер для HTA

Интересно. Хотелось бы задавать PNG файл с прозрачностью, чтобы он был "корпусом" окна. Таким образом можно будет лепить окна любых форм и размеров.

Автоматизирую торговлю. Не 1С

12 (изменено: dab00, 2011-09-13 18:49:01)

Re: HTA: COM-сервер для HTA

Mat Skywalker пишет:

Хотелось бы задавать PNG файл с прозрачностью, чтобы он был "корпусом" окна.

На счет PNG курил - хлопотно, но можно нативно сделать - кода очень много - на VB6 либу рисую, а он с PNG не дружит - однако есть код-конвертор. Но.
В моем понимании можно все сделать на CSS - закругленные окна и пр., рисуем "нарядное" окно-рамку, размещаем его на фасад, в середине делаем прямоугольник, делаем его прозрачным (метод такой есть), под него подсовываем второе окно...
Как то так представляю себе.

13 (изменено: dab00, 2011-09-15 13:25:21)

Re: HTA: COM-сервер для HTA

Mat Skywalker пишет:

Хотелось бы задавать PNG файл с прозрачностью, чтобы он был "корпусом" окна.

ОК, сделаю PNG, уже знаю как . Думаю сегодня напишу.
p.s. Все оказалось сложнее. Дебажу - png окно отображается.  Собираю - окна не видно...
p.p.s По ходу vb6 также не дружит с gdiplus, решение еще более усложняется, на счет "сегодня" я явно погорячился

14 (изменено: dab00, 2011-09-23 17:19:29)

Re: HTA: COM-сервер для HTA

Исправил ошибку с обновлением прозрачности.
Нарисовал иллюстрацию возможностей. Как художник я не очень , вижу так:
http://da440dil.narod.ru/other-images/DAHTACOM-v1.1-4.png
Прозрачное окно можно сделать и с помощью фильтров. Картинки в обоих углах - прозрачные png, загруженные с помощью фильтра AlphaImageLoader. А вот такое нарядное окно с закругленными углами без библиотеки не нарисуешь.
Что касается прозрачного png в качестве "корпуса" окна - пока никак, времени не было. У ActiveX с gdiplus какие-то заморочки, поэтому все непросто.
Скачать можно здесь.
Код HTA:

<html>
<head>
    <title>DAHTACOM</title>
      <HTA:APPLICATION 
        ID = "DAHTACOM"
        APPLICATIONNAME="DAHTACOM"  
        caption="false"
        INNERBORDER="no"
        SINGLEINSTANCE="yes"        
        SCROLL="no"
        ShowInTaskbar ="no"
        BORDER="none"
        SELECTION="no"
        Version = "1.1">
        </HTA:APPLICATION>
</head>

<style type="text/css">    
    
    body{        
        background-color:#ccccdd;    
        font:bold italic 12 sans-serif;        
    }
    
    a{
        border: none;
        text-decoration:none;        
        color:#fff;
    }
    aa{    text-align: center; }
    
    /* наружные блоки */
    
    #b1 {
        position: absolute;
        left: 15px;
        top: 15px;        
        width:400px;        
        z-index: 1;
    }    
    #b2 {
        position: absolute;
        left: 2px;
        top: 5px;        
        width:60px;            
        cursor:hand;
        z-index: 2;
    }    
    #b4 {
        position: absolute;
        left: 368px;
        top: 5px;        
        width:60px;            
        cursor:hand;
        z-index: 2;
    }    
    #b3 {
        position: absolute;
        left: 100px;
        top: 5px;        
        width: 250px;        
        text-align: center;        
        font:bold 16 sans-serif;
        z-index: 3;        
    }    
    
    /* внутренние блоки */
    
    #ib1, #ib2, #ib4 {
        padding:1px;
        text-align: center;    
        overflow: hidden;
        background-color: #4169e1;
    }
    
    #ib1 { height:274px; color:#fff; }
    
    #ib2, #ib4 { height:50px; }
    
    #glow {
        filter:progid:DXImageTransform.Microsoft.Glow(color=red,strength=5);
        width: 200px;        
    }
    #txt{
        width: 300px;
        text-align: left;
        padding-bottom:5px
    }
    
    /* элементы закругления */
    
    b { background-color: #4169e1; }

    #r1, #r2, #r3, #r4, #r5, #r6, #r7, #r8, #r9, #r10 {
        display: block;
        height: 1px;
        overflow: hidden;
        font-size:1px;
        background-color: #4169e1;        
    }

    #r10 { margin: 0 10px; }
    #r9 { margin: 0 9px; }
    #r8 { margin: 0 8px; }
    #r7 { margin: 0 7px; }
    #r6 { margin: 0 6px; }
    #r5 { margin: 0 5px; }
    #r4 { margin: 0 4px; }
    #r3 { margin: 0 3px; }
    #r2 { margin: 0 2px; }
    #r1 { margin: 0 1px; }    
    
</style>

<script language="VBScript">
    On Error Resume Next    
    
    Const LibName = "DAHTACOM.dll"
    Const NewIconName = "snowdrop-16x16-8.ico"
    Const IconName = "daffodil-16x16-8.ico"
    Const NewImgName = "snowdrop-64x64.png"
    Const ImgName = "daffodil-64x64.png"
    Const TipText = "Всплывающая подсказка"
    Const NewTipText = "Новая подсказка"
    Const ImgHelpName = "Help-64.png"
    Dim objDAHTA, wshShell, fso    
    
    Dim x0,y0
    Dim bH 'True - окно скрыто, False - нет
    Dim bI 'True - новые картинки, False - старые
    bH = False
    bI = False
    
    Set wshShell = CreateObject("WScript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    Sub Window_OnLoad()
        'размер подложки
        Window.ResizeTo 430, 314
        Window.MoveTo (Screen.Width \ 2) - 320, (Screen.Height \ 2) - 280
        
        'копируем библиотеку в католог Windows
        'если копирование не удастся - библиотека зарегистрируется из текущего каталога
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FileExists(wshShell.CurrentDirectory & "\" & LibName) Then
            fso.CopyFile wshShell.CurrentDirectory & "\" & LibName, _
                    fso.GetSpecialFolder(0) & "\" & LibName, True
        Else
            MsgBox "Не найден файл " & LibName,vbExclamation,"Ошибка"
            window.close
        End If
        
        'пытаемся зарегистрировать библиотеку
        intRet = RegLib(True)
        If intRet Then        
            Set objDAHTA = CreateObject("DAHTACOM.DAClass")
            'в случае регистрации библиотеки из текущего каталога - работы portable
            'иногда вылетает ошибка - экземпляр класса создается не с первого раза
            If Err.Number <> 0 Then window.close
            'инициализируем объект, чтобы он получил дескриптор окна HTA
            objDAHTA.Init document.title            
            'прозрачность
            objDAHTA.SetTransRGB 204,204,221            
            'картинка и иконка
            SetImg ImgName, IconName, TipText, True
            'картинка Help
            ib4.Style.Filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" & _
                    ImgHelpName & "',sizingMethod='scale');"
            'обработчики событий
            SetEH            
        Else
            MsgBox "Не удалось зарегистрировать библиотеку " & LibName,vbExclamation,"Ошибка"
            window.close
        End If        
    End Sub
    
    Sub Window_OnUnload()
        objDAHTA.DelIcon 'удаляем иконку
        Set objDAHTA = Nothing
        Set fso = Nothing
        Set wshShell = Nothing
        window.close
    End Sub
    
    'регистрация библиотеки, True - регистрируем, False - разрегистрируем
    Function RegLib(bReg)
        Dim strReg
        If bReg Then 
            strReg = "regsvr32.exe /i /s "
        Else
            strReg = "regsvr32.exe u/ /i /s "
        End If        
        intRet = wshShell.Run(strReg & LibName)        
        If intRet = 0 Then 'если удалось зарегистрировать - True
            RegLib = True
        Else
            RegLib = False
        End If    
    End Function
    
    'устанавливаем обработчики событий
    Sub SetEH()
        Set b2OnClick = GetRef("OnClickIcon")
        b2.attachEvent "onclick", b2OnClick
        Set b2OnMouseUp = GetRef("OnMouseUpIcon")
        b2.attachEvent "onmouseup", b2OnMouseUp        
        
        Set b1OnMouseMove = GetRef("MouseMoveWnd")        
        document.attachEvent "onmousemove", b1OnMouseMove
        
        Set b1OnMouseDown = GetRef("MouseDownWnd")        
        document.attachEvent "onmousedown", b1OnMouseDown
        
        Set b4OnClick = GetRef("OnClickHelp")
        b4.attachEvent "onclick", b4OnClick        
        
    End Sub
    
    Sub OnClickHelp()
        If window.event.ctrlKey Then
            Window_OnUnload
        Else        
            window.showModelessDialog "DAHTACOM-HELP.hta",,"dialogHeight:400px; dialogWidth:600px; dialogLeft:10; dialogTop:10"
        End If
    End Sub        
    
    Sub OnClickIcon()
        Const BGColor = "#ccccdd"
        Const BlockColor = "#4169e1"        
        If Not bH Then    'если окно не скрыто
            glow.Filters.Item(0).Enabled = False
            glow.Style.color = BGColor
            With ib1.Style
                .backgroundColor = BGColor
                .color = BGColor
            End With
            For Each  b1ch In b1.childNodes        
                b1ch.Style.backgroundColor = BGColor
            Next
            'картинка Help
            For Each  b4ch In b4.childNodes        
                b4ch.Style.backgroundColor = BGColor
            Next
            ib4.Filters.Item(0).Enabled = False
            
            b3.Style.color = BGColor            
            bH = True
        Else
            glow.Filters.Item(0).Enabled = True
            glow.Style.color = "fff"
            With ib1.Style
                .backgroundColor = BlockColor
                .color = "fff"
            End With
            For Each  b1ch In b1.childNodes        
                b1ch.Style.backgroundColor = BlockColor
            Next
            'картинка Help
            For Each  b4ch In b4.childNodes        
                b4ch.Style.backgroundColor = BlockColor
            Next
            ib4.Filters.Item(0).Enabled = True
            
            b3.Style.color = "#000"    
            bH = False
        End If
    End Sub 
    
    Sub OnMouseUpIcon()
        If window.event.button = 2 Then
            If window.event.ctrlKey Then 'если нажата Ctrl
                If bI Then 'если картинки новые - ставим старые
                    SetImg ImgName, IconName, TipText, False
                    bI = False
                Else
                    SetImg NewImgName, NewIconName, NewTipText, False
                    bI = True
                End If
            Else
                If Not bH Then objDAHTA.HideWnd
            End If
        ElseIf window.event.button = 1 Then
            If window.event.ctrlKey Then Window_OnUnload
        End If
    End Sub
    
    'устанавливаем картинку и иконку
    Sub SetImg(sImg, sIcon, sTip, bMod)        
        ib2.Style.Filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" & _
                sImg & "',sizingMethod='scale');"
        objDAHTA.AddIcon sIcon, sTip, bMod
    End Sub
    
    Sub MouseDownWnd()
        If window.event.button = 2 Then    'если нажата правая кнопка    
            x0=window.event.x
            y0=window.event.y            
        End If
    End Sub
    
    Function MouseMoveWnd()
        If window.event.button = 2 Then 'если нажата правая кнопка                    
            window.moveBy window.event.x-x0, window.event.y-y0            
        End If
    End Function    

</script>

<body>        
    <!-- Содержание -->
    <div id="b1">
        <b id="r10"></b><b id="r7"></b><b id="r5"></b><b id="r4"></b><b id="r3"></b><b id="r2"></b><b id="r2"></b><b id="r1"></b><b id="r1"></b><b id="r1"></b>
        <div id="ib1">
            <div id="glow">
                Иллюстрация возможностей COM-сервера
            </div>
            <div id="txt">
                Нажимаем иконку в левом верхнем углу:<br/>
                - ЛКМ - скрываем-отображаем основное окно<br/>
                - ПКМ - сворачиваем окно в трей<br/>
                - ЛКМ + Ctrl - завершаем работу приложения<br/>
                - ПКМ + Ctrl - меняем иконки<br/>
                Нажимаем иконку в трее:<br/>
                - ЛКМ - отображаем окно приложения<br/>
                - ПКМ - сворачиваем окно в трей<br/>
                - ЛКМ + Ctrl - позиция окна "поверх всех"<br/>
                - ПКМ + Ctrl - отменяем позицию "поверх всех"<br/>
                Нажимаем иконку в правом верхнем углу:<br/>
                - ЛКМ - помощь по использованию библиотеки<br/>
                - ЛКМ + Ctrl - завершаем работу приложения<br/>                
                Перемещение окна - правой кнопкой мыши<br/>                    
            </div>
            <div id="aa">
                <a href="http://da440dil.narod.ru/about.html">&copy;&nbsp;Designed by da440dil</a>
            </div>
        </div>
        <b id="r1"></b><b id="r1"></b><b id="r1"></b><b id="r2"></b><b id="r2"></b><b id="r3"></b><b id="r4"></b><b id="r5"></b><b id="r7"></b><b id="r10"></b>
    </div>
    <!-- Картинка слева -->
    <div id="b2">
        <b id="r10"></b><b id="r7"></b><b id="r5"></b><b id="r4"></b><b id="r3"></b><b id="r2"></b><b id="r2"></b><b id="r1"></b><b id="r1"></b><b id="r1"></b>
        <div id="ib2"></div>
        <b id="r1"></b><b id="r1"></b><b id="r1"></b><b id="r2"></b><b id="r2"></b><b id="r3"></b><b id="r4"></b><b id="r5"></b><b id="r7"></b><b id="r10"></b>
    </div>
    <!-- Картинка справа -->
    <div id="b4">
        <b id="r10"></b><b id="r7"></b><b id="r5"></b><b id="r4"></b><b id="r3"></b><b id="r2"></b><b id="r2"></b><b id="r1"></b><b id="r1"></b><b id="r1"></b>
        <div id="ib4"></div>
        <b id="r1"></b><b id="r1"></b><b id="r1"></b><b id="r2"></b><b id="r2"></b><b id="r3"></b><b id="r4"></b><b id="r5"></b><b id="r7"></b><b id="r10"></b>
    </div>
    <!-- Заголовок -->
    <div id="b3">
        DAHTACOM
    </div>
    
</body> 
</html>

Приглашаю всех попробовать. На мой взгляд некоторые приемы заслуживают внимания.

JSman пишет:

Эх, вспоминаю 2007, старый проектик

Реализация отдаленно напоминает Ваш "старый проектик"
p.s. Кто придумает как убрать фон картинки - тот молодец

15

Re: HTA: COM-сервер для HTA

Добавил возможность обмена данными используя протокол TCP. Нарисовал иллюстрацию использования:
http://da440dil.narod.ru/other-images/DAHTACOM-v1.2-2.png http://da440dil.narod.ru/other-images/DAHTACOM-v1.2-3.png
Ничего особенного, через сокеты - используя mswinsck.ocx. Можно, конечно, и без либы, но, на мой взгляд, предусмотренные свойства и методы (описаны в хэлпе) позволят упростить использование компонента. Приглашаю попробовать: на народе или гугле.

16 (изменено: dab00, 2011-10-13 00:09:36)

Re: HTA: COM-сервер для HTA

Добавил возможность загрузки PNG-картинки, а также ее установки в качестве "корпуса" окна HTA - по наводке уважаемого Mat Skywalker .
Как и в предыдущих версиях нарисовал иллюстрацию использования:

http://da440dil.narod.ru/dahtacom-images/DAHTACOM-v1.3-1.png http://da440dil.narod.ru/dahtacom-images/DAHTACOM-v1.3-8.png

Добавил в хэлп описание новых методов и свойств.
Качаем, тестируем, комментируем.
Ваши замечания, предложения.

17

Re: HTA: COM-сервер для HTA

ДА! Спасибо за труд, это то что нужно.

Автоматизирую торговлю. Не 1С

18

Re: HTA: COM-сервер для HTA

Полезная штука!

19

Re: HTA: COM-сервер для HTA

Очередное обновление компонента - DAHTACOM v1.4.
Добавил возможность отображения  выплывающей подсказки в области уведомлений.
http://da440dil.narod.ru/dahtacom-images/DAHTACOM-v1.4-10.png

20

Re: HTA: COM-сервер для HTA

dab00, круто, очень даже ничего;) О пополнении коллекции не стоит забывать.

21

Re: HTA: COM-сервер для HTA

Осталось только сделать контекстное меню для трея и окна с иконками

Автоматизирую торговлю. Не 1С

22

Re: HTA: COM-сервер для HTA

Очередное обновление компонента - DAHTACOM v1.4.

Архива нет, куда делся?

23

Re: HTA: COM-сервер для HTA

Сорри, она утонула . Пишите на e-mail.

24

Re: HTA: COM-сервер для HTA

Всем привет. На днях случайно обнаружил этот проект у себя в архиве, решил реанимировать.
Удалил кое-что из ненужного: работу с mswinsck.ocx, куски кода для многопоточности - хотел реализовать когда-то, подредактировал код, в общем встречайте - DAHTACOM v1.5.

DAHTACOM - COM-сервер для HTA (HTML Application).
Позволяет приложению использовать недоступные для HTA возможности:
- получать дескриптор любого окна
- создавать, изменять, удалять иконку приложения в области уведомлений, а также всплывающую подсказку к ней
- загружать PNG-изображение с альфа каналом, "прикреплять" его к окну приложения, устанавливать позицию изображения поверх всех окон
- устанавливать прозрачность окна приложения, определенного цвета окна приложения
- устанавливать размер и позицию окна, в том числе позицию поверх всех окон

В настоящее время скачать можно здесь - прямая ссылка, может со временем измениться, но всегда можно будет найти ссылку здесь.
В архиве:
- файл библиотеки,
- пара тестовых HTML-приложений
- пара скриптов установки - bat и vbs
- HTML-файл справки с описанием свойств и методов COM-объекта
- каталог с изображениями, использованными в тестовых приложениях

Кроме того, выложил на Yuotube видео: DAHTACOM. Качаем, устанавливаем, тестируем

Ваши комментарии, коллеги.

25

Re: HTA: COM-сервер для HTA

dab00 пишет:

Добавил возможность обмена данными используя протокол TCP.

2 dab00 можно Вас попросить сделать полный мануал к Вашей библиотеке подобно как здесь а то там не описана данная возможность...:(

Времени не хватает... :-(

26 (изменено: dab00, 2013-12-06 16:57:55)

Re: HTA: COM-сервер для HTA

2 Евген к сожалению

dab00 пишет:

Удалил кое-что из ненужного: работу с mswinsck.ocx

решил что к HTA это отношения не имеет, да и не у всех установлен этот компонент. С ним же можно и без обертки работать из скрипта, вот уважаемый Xameleon мастерил, Вы принимали участие в обсуждении.
Возвращать не собираюсь, причины рассказал, если нужно могу отправить Вам версию с сокетами с описанием свойств и  методов.
Так что мануал сейчас полный, не сомневайтесь.