Что нового

[Интеракция] Можно ли отловить событие от окна IE запущенного из AutoIt ?

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
В последние дни крутится в голове одна мысль... Но не знаю с какой стороны подойти.

Суть в чём. При запуске ботов я рисую GUI, в котором вводятся параметры работы бота. И всё. Дальше этот GUI не нужен, я его закрываю, а бот работает дальше.

Идея в том чтобы вместо GUI нарисовать форму в IE. Можно брать готовый html-файл, можно из скрипта пустить _IEDocWriteHTML.

Но вопрос в том как получить событие от этого окна IE, когда юзер ввёл все параметры и нажимает кнопку <Огонь!> ? Как скрипту узнать что пора из этой формы прочитать данные и начинать копать?
Есть идеи какие-нибудь?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
C2H5OH,
Можно попробовать через
Код:
ObjEvent
И еще где-то есть похожая тема, кажется, от Viktor1703. Там окно в HTML рисовалось.
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Что-то у меня получилось, но коряво как-то
Код:
#include <IE.au3>

Global $LoadFlag = False
Global $iIE
Global $P1, $P2

$oIE=ObjCreate("InternetExplorer.Application.1")	   ; Create Internet Explorer application
$SinkObject=ObjEvent($oIE,"IEEvent_") ; Assign events to UDFs starting with IEEvent_

$oIE.Visible=1
$oIE.RegisterAsDropTarget = 1
$oIE.RegisterAsBrowser = 1

$sHTML = '<html><body><form><table>'&@CR
$sHTML &= '<tr><th>	Кому:</th><td><input name="Param1" type="text" class="input-text" value=""></td></tr>'&@CR
$sHTML &= '<tr><th>	Сколько:</th><td><input name="Param2" type="number" class="input-number" value=""></td></tr>'&@CR
$sHTML &= '<tr><th></th><td>	<input type="submit" class="input-button" value="Огонь!"/></td></tr>'&@CR
$sHTML &= '</table><form></body></html>'
;$oIE.DocumentText = $sHTML			; <=== нифига не получилось

$oIE.Navigate( @ScriptDir&"\form2.html" )

While Not $LoadFlag
	sleep(100)
WEnd

$iIE = _IEAttach("кому","text")

$EventFlag = False

While Not $EventFlag
	sleep(1000)
WEnd

Func IEEvent_NavigateComplete()
	$LoadFlag = True
EndFunc

Func IEEvent_BeforeNavigate()
	If $LoadFlag Then
		$body = _IEBodyReadHTML($iIE)
		$P1 = StringRegExpReplace($body, '(?si).*?<INPUT\sclass=input-text\svalue=(.*?)\sname=Param1>.*', '$1')
		$P2 = StringRegExpReplace($body, '(?si).*?<INPUT\sclass=input-number\svalue=(.*?)\sname=Param2>.*', '$1')
		MsgBox(0,"Человек!",$P1&" ещё "&$P2&" и всё!"&@cr&@cr&$body)
		$SinkObject=0		; Stop IE Events
		$oIE.Quit			; Quit IE
		$oIE=0
		Exit
	EndIf
EndFunc

Не смог обратиться к DocumentText
Код:
$oIE.DocumentText = $sHTML


Код:
xxx.au3 (19) : ==> The requested action with this object has failed.:
$oIE.DocumentText = $sHTML
$oIE.DocumentText = $sHTML^ ERROR
->16:05:53 AutoIT3.exe ended.rc:1

хотя вроде должен был
DocumentText Gets or sets the HTML contents of the page displayed in the WebBrowser control.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Код:
$oIE = ObjCreate("InternetExplorer.Application")
$sName = $oIE.Name
$oIE.ToolBar = False
$oIE.StatusBar = False
$oIE.Visible = True

$sHTML = '<html><body><form><table>'&@CR
$sHTML &= '<tr><th> Кому:</th><td><input name="Param1" type="text" class="input-text" value=""></td></tr>'&@CR
$sHTML &= '<tr><th> Сколько:</th><td><input name="Param2" type="number" class="input-number" value=""></td></tr>'&@CR
$sHTML &= '<tr><th></th><td>    <input type="submit" class="input-button" value="Огонь!"/></td></tr>'&@CR
$sHTML &= '</table><form></body></html>'

$oIE.Navigate('about:blank')
$oIE.Document.Write($sHTML)

While 1
	If Not WinExists('[REGEXPTITLE:'& $sName &']') Then Exit
    Sleep(100)
WEnd
 
Автор
C2H5OH

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Спасибо! Разобрался)
На странице http://autoit-script.ru/autoit3_docs/intro/ComRef.htm
самую полезную для себя ссылку http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.aspx
я нашел в комментариях скрипта-примера.
Но там почему-то нет упоминания о методе Document.Write
(хотя досадно - как же я не догадался .Write дописать...)

Модераторы, перенесите, пожалуйста, тему в какой-нибудь производственный раздел, чтобы можно было пометить её как решенную.
 
Верх