Advertisement
omegastripes

wsh_vbs_gui_via_mshta_createwindow_with_events_handlers.vbs

Jan 20th, 2018
298
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VBScript 11.46 KB | None | 0 0
  1. Option Explicit
  2.  
  3. ' Base64-кодированный фоновый рисунок
  4. Const BGI = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWIAAAB2CAYAAADybJlDAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAUjSURBVHja7N05ztxGEIBRjqHciZ34Bn3/w9QNnPsE49QwtPwc9lLd9V4kAdKwyQE+Fjnb6/1+XwCs85tDACDEAEIMgBADCDEAQgwgxAAIMYAQAyDEAEIMgBADCDEAQgwgxACM980hgD28Xq/Td7Hd/PdxzHPri+FBiBPH9hPbBVqIQYh3D+/2YRZiEOIT47tVmIUYhLhCfFMHWYhBiKsFOF2UhRiEuHKAUwRZiEGIBXhxkIUYhFiAFwdZiEGIBXhxjIUYhDhLhCP5OocFWYhBiGeHLaxdiEGI54YsNljj0n0SYhDiEYGLhGtKG2MhBiHOFuCdXiDsEmMhhtoh7hW9SLKOLWMsxFA3xD3iVznA3Y6FEEPNED8NoAB3PC5CDPVCvDLCFT4gcvv4CDHUCvGTEFYKcMw8Vn48FOpYEeG28RQ87cRjIoYaE/GnMdxpCo7O2336eH9f1/WPEIMQr4jwyo8Zt4HbaqOOoRCDEGePcCzc9pQYCzGcHeJZER45ia6ewmP0MfViHZxrxwjHle9XltvoYyTEIMIZIvwkwDNvvfT6/0IMpInw0wn4SYTj4Xa63T4RYjANr4hwj1sQKybhIc+NEIMIz4xwr3vAvSI8eyo2EQNLAphhGo1Ej92EGESyW0AWhbD3fkaHbT86lkIMNc2KcO+3ox3500lCDPWm4ZkRXjnx31lDTDgeP3wcIYZaEZ712Bk+lBG7bFOIoZbYdBsz3g0SC/a/CTGw6lZAlok/xZqEGGrFsg163FW3AnqvY8lULMQg3pkj3JKsYyghhjrT8KhL66oRbr3WI8Qg5OUm0Gz7JMQgxhmDdcoJ4UvrEmKoF9AfPVbbdN+2n8qFGNg5fkfcGhFiIFP82mb72Ho8lhDD+dOrqdxEDCyc6mLAY54+lQsxkDrspvwBx06IQUDtj4kYGDA5xnf+Hpvv07GEGEzHd4LZO5qVXqALIQZ6xaxtuu602xNiYNV03A46FkIM7BuhpNPwVEIM50VvxddBjvqC+hKEGAQ9++PG6U+IEAOzp+M7wS7xHmghBnaajk3EgEA+nI4rT8NCDNy+hO4VQtPxL3xzCIAvTKWz3zOcYRr+a9ZaTcSA2wTf9/usDQkxcCfGMWk7pQgx1PGHUAoxsNafHUM7ajouGXkhBjKFc8RXbQoxUCLGgizEgCB33+60KwIhBgR5ceB9oAPYNWTHvLBnIoa9Js2el9UnRPmIfRViYNol+CZBnh53tyaAE+O/1ScAhRgQ5cWEGBgZwa9OlW3SeqLj2rsdF/eIQQxXif/9OSYdlx73lLuuVYhhL9kvs3sELiau9b9RXnbyEmIg6wln5kln6U84CTGcK/Ptibjx72ZHefpz4cU6YJfwx6Tt3NnPLicIIYY9L9vb5us/Icg/W8OtfRRiOH9KPfXL1mPiND706kCIgenhKRblX/JiHdS5vM/wpUGzPnq81Qt8Qgym1dNPWOmjLMRQayquHPq0URZiMBVXO3GYiIEtYnjy7Yxs+xZCDDXCOipAuwW7fXB8h0/y3r4GZDthZIrwz9bfeh0XIYYzIvfVKNyJx0kfBmmDjnuXbbk1AZzukwjHhG2FEINL/4xTZpUIm4hBjKfGdtXtjZZ4WyHEwOk+jfCSk4YQg6k402S5Y4Tb0+0IMTAyPpF0XWkiLMRgKj5lKn7yy8yx+pgIMYhxlel8dYRDiEGMT5uK23VAhIUYqDgFp4rwdV3X6/1+e0phA6/Xa7dJ9rT3NQ+7B/0vAAAA//8DAERsQ7O6796eAAAAAElFTkSuQmCC"
  5.  
  6. Dim aItems, i
  7.  
  8. ' Массив, содержащий пункты для списка
  9. aItems = Array("Пункт A", "Пункт B", "Пункт C", "Пункт D", "Пункт E")
  10.  
  11. ' Создание обертки HTA окна
  12. With New clsSmallWrapperForm
  13.     ' Настройка окна
  14.     .ShowInTaskbar = "yes"
  15.     .Title = "Тест формы HTA"
  16.     .BackgroundImage = BGI
  17.     .Width = 354
  18.     .Height = 118
  19.     .Visible = False
  20.     ' Создание окна
  21.     .Create
  22.     ' Назанчение обработчиков
  23.     Set .Handlers = New clsSmallWrapperHandlers
  24.     ' Добавление списка
  25.     With .AddElement("ListBox1", "SELECT")
  26.         .size = 6
  27.         .multiple = True
  28.         .style.left = "15px"
  29.         .style.top = "10px"
  30.         .style.width = "250px"
  31.     End With
  32.     .AppendTo "Form"
  33.     ' Добавление пунктов в список
  34.     For i = 0 To UBound(aItems)
  35.         .AddElement , "OPTION"
  36.         .AddText aItems(i)
  37.         .AppendTo "ListBox1"
  38.     Next
  39.     ' Добавление кнопки OK
  40.     With .AddElement("Button1", "INPUT")
  41.         .type = "button"
  42.         .value = "OK"
  43.         .style.left = "285px"
  44.         .style.top = "10px"
  45.         .style.width = "50px"
  46.         .style.height = "20px"
  47.     End With
  48.     .AppendTo "Form"
  49.     ' Добавление кнопки Отмена
  50.     With .AddElement("Button2", "INPUT")
  51.         .type = "button"
  52.         .value = "Отмена"
  53.         .style.left = "285px"
  54.         .style.top = "40px"
  55.         .style.width = "50px"
  56.         .style.height = "20px"
  57.     End With
  58.     .AppendTo "Form"
  59.     ' Добавление надписи
  60.     With .AddElement("Label1", "SPAN")
  61.         .style.left = "15px"
  62.         .style.top = "98px"
  63.         .style.width = "350px"
  64.     End With
  65.     .AddText "Выберите пункты"
  66.     .AppendTo "Form"
  67.     ' Показать окно
  68.     .Visible = True
  69.     ' Ожидание закрытия окна или выбора пунктов пользователем
  70.     Do While .ChkDoc And Not .Handlers.Selected
  71.         WScript.Sleep 100
  72.     Loop
  73.     ' Получение результатов из массива .Handlers.SelectedItems
  74.     If .Handlers.Selected Then
  75.         MsgBox "Выбрано " & (UBound(.Handlers.SelectedItems) + 1) & " пункт(ов)" & vbCrLf & Join(.Handlers.SelectedItems, vbCrLf)
  76.     Else
  77.         MsgBox "Окно закрыто"
  78.     End If
  79.     ' Остальная часть кода ...
  80.    
  81. End With
  82.  
  83. Class clsSmallWrapperHandlers
  84.    
  85.     ' Класс обработчиков реализует обработку событий
  86.     ' Отредактируйте код для обеспечения требуемого поведения
  87.     ' Сохраняйте общепринятые для VB имена обработчиков: Public Sub <ID элемента>_<Название события>()
  88.    
  89.     Public oswForm ' обязательное свойство
  90.    
  91.     Public Selected
  92.     Public SelectedItems
  93.    
  94.     Private Sub Class_Initialize()
  95.         Selected = False
  96.         SelectedItems = Array()
  97.     End Sub
  98.    
  99.     Public Sub ListBox1_Click()
  100.         Dim vItem
  101.         With CreateObject("Scripting.Dictionary")
  102.             For Each vItem In oswForm.Window.ListBox1.childNodes
  103.                 If vItem.Selected Then .Item(vItem.innerText) = ""
  104.             Next
  105.             SelectedItems = .Keys()
  106.         End With
  107.         oswForm.Window.Label1.style.color = "buttontext"
  108.         oswForm.Window.Label1.innerText = (UBound(SelectedItems) + 1) & " выбрано"
  109.     End Sub
  110.    
  111.     Public Sub Button1_Click()
  112.         Selected = UBound(SelectedItems) >= 0
  113.         If Selected Then
  114.             oswForm.Window.close
  115.         Else
  116.             oswForm.Window.Label1.style.color = "darkred"
  117.             oswForm.Window.Label1.innerText = "Выберите хотя бы 1 пункт"
  118.         End If
  119.     End Sub
  120.    
  121.     Public Sub Button2_Click()
  122.         oswForm.Window.close
  123.     End Sub
  124.    
  125. End Class
  126.  
  127. Class clsSmallWrapperForm
  128.    
  129.     ' Служебный класс для функциональности HTA окна
  130.     ' Не подлежит изменению
  131.    
  132.     ' Аттрибуты тэга HTA
  133.     Public Border ' thick | dialog | none | thin
  134.     Public BorderStyle ' normal | complex | raised | static | sunken
  135.     Public Caption ' yes | no
  136.     Public ContextMenu ' yes | no
  137.     Public Icon ' path
  138.     Public InnerBorder ' yes | no
  139.     Public MinimizeButton ' yes | no
  140.     Public MaximizeButton ' yes | no
  141.     Public Scroll ' yes | no | auto
  142.     Public Selection ' yes | no
  143.     Public ShowInTaskbar ' yes | no
  144.     Public SysMenu ' yes | no
  145.     Public WindowState ' normal | minimize | maximize
  146.    
  147.     ' Свойства формы
  148.     Public Title
  149.     Public BackgroundImage
  150.     Public Width
  151.     Public Height
  152.     Public Left
  153.     Public Top
  154.     Public Self
  155.    
  156.     Dim oWnd
  157.     Dim oDoc
  158.     Dim bVisible
  159.     Dim oswHandlers
  160.     Dim oLastCreated
  161.    
  162.     Private Sub Class_Initialize()
  163.         Set Self = Me
  164.         Set oswHandlers = Nothing
  165.         Border = "thin"
  166.         ContextMenu = "no"
  167.         InnerBorder = "no"
  168.         MaximizeButton = "no"
  169.         Scroll = "no"
  170.         Selection = "no"
  171.     End Sub
  172.    
  173.     Private Sub Class_Terminate()
  174.         On Error Resume Next
  175.         oWnd.Close
  176.     End Sub
  177.    
  178.     Public Sub Create()
  179.         Dim sName, sAttrs, sSignature, oShellWnd, oProc
  180.         sAttrs = ""
  181.         For Each sName In Array("Border", "Caption", "ContextMenu", "MaximizeButton", "Scroll", "Selection", "ShowInTaskbar", "Icon", "InnerBorder", "BorderStyle", "SysMenu", "WindowState", "MinimizeButton")
  182.             If Eval(sName) <> "" Then sAttrs = sAttrs & " " & sName & "=" & Eval(sName)
  183.         Next
  184.         If Len(sAttrs) >= 240 Then Err.Raise 450, "<HTA:APPLICATION" & sAttrs & " />"
  185.         sSignature = Mid(Replace(CreateObject("Scriptlet.TypeLib").Guid, "-", ""), 2, 16)
  186.         Set oProc = CreateObject("WScript.Shell").Exec("mshta ""about:<script>moveTo(-32000,-32000);document.title='*'</script><hta:application" & sAttrs & " /><object id='s' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>s.putProperty('" & sSignature & "',document.parentWindow);</script>""")
  187.         Do
  188.             If oProc.Status > 0 Then Err.Raise 507, "mshta.exe"
  189.             For Each oShellWnd In CreateObject("Shell.Application").Windows
  190.                 On Error Resume Next
  191.                 Set oWnd = oShellWnd.GetProperty(sSignature)
  192.                 If Err.Number = 0 Then
  193.                     On Error Goto 0
  194.                     With oWnd
  195.                         Set oDoc = .document
  196.                         With .document
  197.                             .open
  198.                             .close
  199.                             .title = Title
  200.                             .getElementsByTagName("head")(0).appendChild .createElement("style")
  201.                             .styleSheets(0).cssText = "* {font:8pt tahoma;position:absolute;}"
  202.                             .getElementsByTagName("body")(0).id = "Form"
  203.                         End With
  204.                         .Form.style.background = "buttonface"
  205.                         If BackgroundImage <> "" Then
  206.                             .Form.style.backgroundRepeat = "no-repeat"
  207.                             .Form.style.backgroundImage = "url(" & BackgroundImage & ")"
  208.                         End If
  209.                         If IsEmpty(Width) Then Width = .Form.offsetWidth
  210.                         If IsEmpty(Height) Then Height = .Form.offsetHeight
  211.                         .resizeTo .screen.availWidth, .screen.availHeight
  212.                         .resizeTo Width + .screen.availWidth - .Form.offsetWidth, Height + .screen.availHeight - .Form.offsetHeight
  213.                         If IsEmpty(Left) Then Left = CInt((.screen.availWidth - Width) / 2)
  214.                         If IsEmpty(Top) Then Top = CInt((.screen.availHeight - Height) / 2)
  215.                         bVisible = IsEmpty(bVisible) Or bVisible
  216.                         Visible = bVisible
  217.                         .execScript "var smallWrapperThunks = (function(){" &_
  218.                             "var thunks,elements={};return {" &_
  219.                                 "parseHandlers:function(h){" &_
  220.                                     "thunks=h;for(var key in thunks){var p=key.toLowerCase().split('_');if(p.length==2){elements[p[0]]=elements[p[0]]||{};elements[p[0]][p[1]]=key;}}}," &_
  221.                                 "forwardEvents:function(e){" &_
  222.                                     "if(elements[e.id.toLowerCase()]){for(var key in e){if(key.search('on')==0){var q=elements[e.id.toLowerCase()][key.slice(2)];if(q){eval(e.id+'.'+key+'=function(){thunks.'+q+'()}')}}}}}}})()"
  223.                         If Not oswHandlers Is Nothing Then
  224.                             .smallWrapperThunks.parseHandlers oswHandlers
  225.                             .smallWrapperThunks.forwardEvents .Form
  226.                         End If
  227.                     End With
  228.                     Exit Sub
  229.                 End If
  230.                 On Error Goto 0
  231.             Next
  232.             WScript.Sleep 100
  233.         Loop
  234.     End Sub
  235.    
  236.     Public Property Get Handlers()
  237.         Set Handlers = oswHandlers
  238.     End Property
  239.    
  240.     Public Property Set Handlers(oHandlers)
  241.         Dim oElement
  242.         If Not oswHandlers Is Nothing Then Set oswHandlers.oswForm = Nothing
  243.         Set oswHandlers = oHandlers
  244.         Set oswHandlers.oswForm = Me
  245.         If ChkDoc Then
  246.             oWnd.smallWrapperThunks.parseHandlers oswHandlers
  247.             For Each oElement In oDoc.all
  248.                 If oElement.id <> "" Then oWnd.smallWrapperThunks.forwardEvents oElement
  249.             Next
  250.         End If
  251.     End Property
  252.    
  253.     Public Sub ForwardEvents(oElement)
  254.         If ChkDoc Then oWnd.smallWrapperThunks.forwardEvents oElement
  255.     End Sub
  256.    
  257.     Public Function AddElement(sId, sTagName)
  258.         Set oLastCreated = oDoc.createElement(sTagName)
  259.         If VarType(sId) <> vbError Then
  260.             If Not(IsNull(sId) Or IsEmpty(sId)) Then oLastCreated.id = sId
  261.         End If
  262.         oLastCreated.style.position = "absolute"
  263.         Set AddElement = oLastCreated
  264.     End Function
  265.    
  266.     Public Function AppendTo(vNode)
  267.         If Not IsObject(vNode) Then Set vNode = oDoc.getElementById(vNode)
  268.         vNode.appendChild oLastCreated
  269.         ForwardEvents oLastCreated
  270.         Set AppendTo = oLastCreated
  271.     End Function
  272.    
  273.     Public Function AddText(sText)
  274.         oLastCreated.appendChild oDoc.createTextNode(sText)
  275.     End Function
  276.    
  277.     Public Property Get Window()
  278.         Set Window = oWnd
  279.     End Property
  280.    
  281.     Public Property Get Document()
  282.         Set Document = oDoc
  283.     End Property
  284.    
  285.     Public Property Get Visible()
  286.         Visible = bVisible
  287.     End Property
  288.    
  289.     Public Property Let Visible(bWindowVisible)
  290.         bVisible = bWindowVisible
  291.         If ChkDoc Then
  292.             If bVisible Then
  293.                 oWnd.moveTo Left, Top
  294.             Else
  295.                 oWnd.moveTo -32000, -32000
  296.             End If
  297.         End If
  298.     End Property
  299.    
  300.     Public Function ChkDoc()
  301.         On Error Resume Next
  302.         ChkDoc = CBool(TypeName(oDoc) = "HTMLDocument")
  303.     End Function
  304.    
  305. End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement