Что нового

Обработка HTML кода в AutoIt'e

Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А что если сделать так, создаём объект IE на форме с готовым Html кодом, далее между тегами <head></head> добавить js библиотеку например

Код:
<script type="text/javascript" src="js/jquery.corner.js"></script>

Сделать спец. функцию с таким кодом

Код:
<script type="text/javascript">
$(document).ready(function(){
  $("#example").corner("round");
});
</script>

И тоже добавляем между тегами <head></head>,а дальше собирать интерфейс, если какому то элементу нужно закруглить углы то вызываем эту функцию
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Почему не получается в Shell.Explorer.2 вывести GUI сделанное на JQuery ?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Viktor1703
Не нужно читать файл функцией FileRead, его сам Shell.Explorer.2 своим методом Navigate читает
Код:
#include <WindowsConstants.au3>

$hObj = ObjCreate('Shell.Explorer.2')
$hForm = GUICreate('', @DesktopWidth, @DesktopHeight, 0, 0, -1)

GUICtrlCreateObj($hObj, 0, 0, @DesktopWidth, @DesktopHeight)
$hObj.Navigate(@ScriptDir & '\index.html')

GUISetState()

While 1
	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch
Wend
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Re: Обработка HTML кода в AutoIt\'e

Ну точно же, а я уже запаниковал :smile:


Добавлено:
Сообщение автоматически объединено:

Вот что получается ;D

Код:
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>

$hObj = ObjCreate('Shell.Explorer.2')
$hForm = GUICreate('', @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0xFF00DC)
GUICtrlCreateObj($hObj, 0, 0, @DesktopWidth, @DesktopHeight)
$hObj.Navigate(@ScriptDir & '\index.html')
$hObj.document.BgColor = '#FF00DC'
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC, 255)
GUISetState()

While 1
	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch
Wend
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
После
Код:
$hObj.document.BgColor = '#FF00DC'

Добавь
Код:
$hObj.refresh
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Зачем? мне как раз и нужно прозрачное AutoIt GUI
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Ааа, ну оно как бы прозрачное до первого обновления
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Контекстного меню с обновлением не будет
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Re: Обработка HTML кода в AutoIt\'e

Перехват ;D


Добавлено:
Сообщение автоматически объединено:

А есть возможность в Shell.Explorer.2 отобразить картинку в Base64 формате? :scratch:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Да, сложновато писать, особенно если не знаешь Web программирования, я посмотрел ещё в сторону HtmLayout, Garrett, подскажите пожалуйста, если знаете, что умеет HtmLayout, просто я немного переписал UDF
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Viktor1703
UDF что на офф. сайте меня не вдохновила :(
Во-первых, видно, что человек делал ее, ориентируясь чисто на себя, а не на сообщество программистов Autoit.
Во-вторых, она не использует полные возможности HtmLayout.

Сама dll довольно таки сложная. Чтобы сделать хорошую библиотеку человек должен хорошо разбираться в структурах, функциях обратного вызова и т.д.

HtmLayout может многое, это разговор не на одну тему. Многие компании уже давно используют HtmLayout в своих продуктах, Symantec, ALAWAR и т.д. делают свои интерфейсы именно на ней.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Re: Обработка HTML кода в AutoIt\'e

Да именно та UDF, и список функций у неё богатый, может стоит тогда заняться именно ей, так как она много чего умеет, проблема только в том что я не знаю где можно взять описание функций этой dll, если на оф.сайте HtmLayout, то мне будет в 2 раза сложней, мало того что нужно понять что какая функция делает, так ещё нужно знать английский что бы это понять, к сожалению я английский не знаю :(


Добавлено:
Сообщение автоматически объединено:

Вот первая функция в этой dll

Код:
EXTERN_C HLDOM_RESULT HLAPI HTMLayoutAnimateElement( HELEMENT he, HTMLayoutElementAnimator* pAnimator, LPVOID animatorParam);

Я так понял возвращаемое значение - handle
pAnimator - это указатель, т.е. "ptr"
LPVOID мне не очень понятно, это тоже указатель? или это DWORD?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вот небольшой пример для обработки событий, есть минусы, если нажимаем на элемент то в консоль пишется onmousedown, если отжимаем мышь то пишется onmouseup, но если быстро нажимать на элемент то получится что в консоль будет отдаваться onmousedown через каждые две onmouseup, и ещё один минус, нажатия также срабатывают если всё это делать правой кнопкой мыши.
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Viktor1703
Может итоговый вариант поместить в первый пост, как результат или открыть новую тему UDF. Я сейчас заинтересовался оболочкой на основе HTML. У меня уже есть сбоник программ на основе фреймов и при нажатие кнопок обычно сопровождается открытием каталога в браузере, было бы удобней открывать в проводнике или даже запустить инсталяцию, поэтому я хотел иметь обработчик событий от объекта в GUI.

При тесте некоторые примеры держали процессор на 10% иногда до 50%, в общем попробовал все примеры.

Я уже встречал такие аналоги, одна оболочка-инсталятор с CD имела вкладки слева на основе GUI, а описание и скрины в объекте.

Интересует даже не создание интерфейса с помощью функций используя AutoIt, а скорее возможность поддержки обработки некоторой конструкции внутри HTML. То есть пользователь внутри HTML пишет строку <тег>_AutoIt_Run="%SystemRoot%\explorer.exe C:\"</тег> и при клике на картинке/ссылке, внутри которой этот тег указан происходит выполнение команды.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
AZJIO
Можно конечно и продолжить UDF и написать грамотный обработчик событий, но Shell.Explorer.2 меня не устраивает, не знаю как выразиться, я Web программированием не занимаюсь, по этому как смогу, этот объект не поддерживает CSS3, а значит оформить окно красиво нам помогут только нарезанные картинки и опять же таскать с собой картинки в открытом виде не удобно, загрузить в ресурсы?! как тогда потом их отобразить в объекте, пробовал закодировать картинку в Base64 но у меня так и не получилось отобразить их в Shell.Explorer.2, возможно это тоже не поддерживает, я бы лучше по разбирался бы с HtmLayout но далеко я не уйду, С/C++ знаю на уровне "Hello World", информацию по описанию функций встречал только на английском языке в котором я тоже не очень силён, могу только догадываться и предполагать...
 

AZJIO

Меценат
Меценат
Сообщения
2,878
Репутация
1,194
Ну даже логически я понимаю, что CSS3 не будет рисовать картинки даже если бы поддерживался объектом. А google выдал некоторые отличия, половина из которых просто решались более сложным кодом, так что из всего того что CSS3 поддерживает нового - прозрачность.
На счёт ресурсов, да если программа законченный/завершённый продукт, конечно красивее смотрится одним файлом. Но я не гнушаюсь варианта с ипользованием ресурсов из папки, т.е. EXE-файл и рядом папка с ресурсами. Может даже поэтому мне нравятся оболочки, которые можно перестроить изменив вынесенные за пределы EXE-файла настройки и ресурсы. В данном случае EXE-файл просто движок, а контент весь снаружи.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Я попробовал сделать картинку и по нажатию на неё получить содержимое находящееся между <img></img>, но не получилось, может есть какие нибудь другие способы получения этого содержимого, имеется ввиду <тег>_AutoIt_Run="%SystemRoot%\explorer.exe C:\"</тег>, но я его составил так <autoit type="run" value="%SystemRoot%\explorer.exe C:\"></autoit>, либо может другой способ передачи параметров в скрипт, например написать xml:

Код:
<?xml version="1.0" encoding="UTF-8"?>
<autoit>
  <element id="image_0">
    <param type="run" value="%SystemRoot%\explorer.exe C:\" />
  </element>
</autoit>

Пример AutoIt скрипта:
Код:
$hObj = ObjCreate('Shell.Explorer.2')
$hForm = GUICreate('', 500, 400)
GUICtrlCreateObj($hObj, 0, 0, 500, 400)
$hObj.navigate(@ScriptDir & '\test.html')
$hObj.document.bgcolor = '#303030'
GUISetState()

While 1
	$event = WebEvent($hObj)
	If IsArray($event) Then
		Switch $event[0]
			Case 'image_0'
				Switch $event[1]
					Case 'mouseover'
						If IsObj($hObj) Then
							$hObj.document.getElementById('image_0').src = 'autoit_1.png'
						    $hObj.document.getElementById('image_0').style.left = '98px'
							$hObj.document.getElementById('image_0').style.top = '98px'
						EndIf
					Case 'mouseout'
						If IsObj($hObj) Then
							$hObj.document.getElementById('image_0').src = 'autoit_0.png'
						    $hObj.document.getElementById('image_0').style.left = '100px'
							$hObj.document.getElementById('image_0').style.top = '100px'
						EndIf
					Case 'mouseup'
						MsgBox(0, '', '')
	            EndSwitch
		EndSwitch
	Endif

	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch
Wend

Func WebEvent($hObject)
	Local $aRet[2], $sEvent
	If IsObj($hObject) Then
		$sEvent = $hObject.document.getElementById('event_document').value
		If $sEvent Then
			$hObject.document.getElementById('event_document').value = ''
			$aData = StringSplit($sEvent, ':')
			If (IsArray($aData) And ($aData[0] == 2)) Then
			    $aRet[0] = $aData[1]
			    $aRet[1] = $aData[2]
			    Return $aRet
			EndIf
		EndIf
	EndIf
	Return 0
EndFunc

Пример Html кода:
Код:
<html>
  <head>
    <meta http-equiv="MSThemeCompatible" content="Yes">
  </head>
  <script>
    document.onmousedown = event_;
    document.onmouseup = event_;
    document.onmouseover = event_;
    document.onmouseout = event_;

    function event_(){
      var srcid = event.srcElement.id;
      if (srcid){
        document.getElementById("event_document").value = srcid + ":" + event.type;
      }
    }
  </script>
  <style>
    body {
      border: none;
      margin: 0px;
      padding: 0px;
      overflow: hidden;
    }
  </style>
  <body>
    <input type="label" id="event_document" style="display: none;"></input>
    <img id="image_0" src="autoit_0.png" style="position: absolute; left: 100px; top: 100px; cursor: pointer;"/>
  </body>
</html>

И архив с картинками и исходниками
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
А если попробовать обрабатывать событие ONCLICK?
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
А если попробовать обрабатывать событие ONCLICK?

Тоже не выходит, видимо объект игнорирует тег <autoit> так как не может определить что это вообще такое

Добавил обработку события Double Click и Click, отключил контекстное меню и обновление объекта нажатием F5

AutoIt
Код:
$hObj = ObjCreate('Shell.Explorer.2')
$hForm = GUICreate('', 500, 400)
GUICtrlCreateObj($hObj, 0, 0, 500, 400)
$hObj.navigate(@ScriptDir & '\test.html')
$hObj.document.bgcolor = '#303030'
GUISetState()

While 1
	$event = WebEvent($hObj)
	If IsArray($event) Then
		Switch $event[0]
			Case 'image_0'
				Switch $event[1]
					Case 'over'
						If IsObj($hObj) Then
							$hObj.document.getElementById('image_0').src = 'autoit_1.png'
						    $hObj.document.getElementById('image_0').style.left = '98px'
							$hObj.document.getElementById('image_0').style.top = '98px'
						EndIf
					Case 'out'
						If IsObj($hObj) Then
							$hObj.document.getElementById('image_0').src = 'autoit_0.png'
						    $hObj.document.getElementById('image_0').style.left = '100px'
							$hObj.document.getElementById('image_0').style.top = '100px'
						EndIf
                    Case 'click'
                        ConsoleWrite('click' & @CR)
					Case 'dbclick'
						MsgBox(0, '', '')
	            EndSwitch
		EndSwitch
	Endif

	Switch GUIGetMsg()
	    Case -3
		    Exit
	EndSwitch
Wend

Func WebEvent($hObject)
	Local $aRet[2], $sEvent
	If IsObj($hObject) Then
		$sEvent = $hObject.document.title
		If $sEvent Then
			$hObject.document.title = ''
			$aData = StringSplit($sEvent, ':')
			If (IsArray($aData) And ($aData[0] == 2)) Then
			    $aRet[0] = $aData[1]
			    $aRet[1] = $aData[2]
			    Return $aRet
			EndIf
		EndIf
	EndIf
	Return 0
EndFunc

Html
Код:
<html>
  <head>
    <meta http-equiv="MSThemeCompatible" content="Yes">
  </head>
  <script>
    document.oncontextmenu = function() { return false; };
    document.onkeydown     = function() { if (event.keyCode == 116) { event.keyCode = 0; return false; } };
    document.onmousedown   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":down";    } };
    document.onmouseup     = function() { var id = event.srcElement.id; if (id) { document.title = id + ":up";      } };
    document.onmouseover   = function() { var id = event.srcElement.id; if (id) { document.title = id + ":over";    } };
    document.onmouseout    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":out";     } };
    document.onclick       = function() { var id = event.srcElement.id; if (id) { document.title = id + ":click";   } };
    document.ondblclick    = function() { var id = event.srcElement.id; if (id) { document.title = id + ":dbclick"; } };
  </script>
  <style>
    body {
      border: none;
      margin: 0px;
      padding: 0px;
      overflow: hidden;
    }
  </style>
  <body>
      <img id="image_0" src="autoit_0.png" style="position: absolute; left: 100px; top: 100px; cursor: pointer;">
        <autoit type="run" value="%SystemRoot%\explorer.exe C:\"></autoit>
      </img>
  </body>
</html>
 
Верх