Что нового

[Сеть, интернет] IE. Отображение статуса загрузки страницы в GUI.

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
И вот я опять сижу на работе и изучаю работу с IE функциями, и опять у меня возникает вопрос. Как отобразить в гуи состояние загрузки веб страницы? :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Belfigor
Это самое слабое звено в работе с IE! Потому как событие загрузки документа происходит тогда, когда загружен DOM, в то время как мультимедийный контент может продолжать грузится!
Получается, что страница вроде и загружена, но картинка (к примеру) ещё не доступна. :smile:
Это, если мы говорим о полной загрузки страницы!
Belfigor [?]
Как отобразить в гуи
Вы имеете в виду прогрессбар?
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Да, именно прогресс бар. То есть я хочу вывести в гуи прогресс бар, который будет отображать состояние загрузки страницы, окончанием загрузки считается тот момент, когда функция _IELoadWait возобновляет работу скрипта. То есть в данном случае я так полагаю какая-то другая функция обладающая возможность отображать состояние загрузки страницы должна заменить функцию _IELoadWait
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Belfigor
У меня примерно так получилось:
Код:
#include <GUIConstantsEx.au3>
#include <IE.au3>

$Form1 = GUICreate("Проба", 300, 200, -1, -1)
$Button1 = GUICtrlCreateButton("Поехали", 100, 20, 100, 30)
$Progress1 = GUICtrlCreateProgress(5, 100, 290, 22)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_MyProgress()
			WinSetState("[Class:IEFrame]", "", @SW_MAXIMIZE)
			WinWait("[Class:IEFrame]")
			WinActivate("[Class:IEFrame]")
			$oIE = _IEAttach("", "instance", 1)
			_IENavigate($oIE, "http://www.google.ru/")
	EndSwitch
WEnd

Func _MyProgress()
	Dim $aPercent[1]
	Local $i = 0
	Local $timeout = TimerInit()
	GUICtrlSetState($Button1, $GUI_DISABLE)
	GUICtrlSetData($Progress1, "")
	Run("""C:\Program Files\Internet Explorer\iexplore.exe"" http://usde.biz/", "", @SW_HIDE)

	While 1
		If TimerDiff($timeout) > 20000 Then
			GUICtrlSetState($Button1, $GUI_ENABLE)
			MsgBox(0, "Ошибка.", "Превышен лимит времени.", 3)
			Return
		EndIf
		Sleep(5)
		$sTest = StatusbarGetText("[Class:IEFrame]")
		$sTest = StringLeft($sTest, StringInStr($sTest, ")"))
		$sTest = StringRegExpReplace($sTest, "[^0-9]", "")
		If StringIsDigit($sTest) = 1 Then
			$i += 1
			ReDim $aPercent[UBound($aPercent) + 1]
			$aPercent[$i] = $sTest
			$iPercent = ($aPercent[1] - $aPercent[$i]) / $aPercent[1] * 100
			GUICtrlSetData($Progress1, $iPercent)
		EndIf
		If StatusbarGetText("[Class:IEFrame]") = "Готово" Then ExitLoop
	WEnd
	GUICtrlSetData($Progress1, 100)
	GUICtrlSetState($Button1, $GUI_ENABLE)
	MsgBox(0, "Готово!", "Страница загружена.", 3)
EndFunc   ;==>_MyProgress
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
У меня увы не взлетело :(. Грузился на яндекс, даже когда страница уже отобразилась и загрузилась, программа после некоторого времени писала "Превышен лимит времени". И я пытаюсь отобразить в гуи состояние загрузки страницы созданной через IECreate


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

Хотя идея про [CLASS:msctls_statusbar32; INSTANCE:1] интересна, попробую написать свой аналог IELoadWait, но все же хотелось бы узнать нет ли уже готовых решений, дабы не создавать велосипед :smile:


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

Есть команда StatusbarGetText . Но что ControlGetText , что StatusbarGetText, все работают с тайтлами окна, но тайтл окна ежесекундно изменяется, а хендл они не принимают :'(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Belfigor,
А Вы поменяли все title "Скачать бесплатно" на "Яндекс"?
У меня Яндекс очень быстро грузится, поэтому я специально выбрал сайт http://usde.biz/ - там картинок много. Для Яндекс`a я добавил
Код:
;...
WEnd
	GUICtrlSetData($Progress1, 100)
	BlockInput(0)
;...
У меня работает.
А потом можно через _IEAttach() передать управление функциям из библиотеки <IE.au3>
Еще можно вместо title "Скачать бесплатно" или "Яндекс" поставить "[Class:IEFrame]", чтобы не важен был заголовок окна.
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Спасибо за подсказку про CLASS:IEFrame. Вот, чудненько работает:
Код:
[autoit]While 1
Sleep(100)
ToolTip(StatusbarGetText("[CLASS:IEFrame]"),0,0)
WEnd



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

Нет, не чудненько :(. Оно читает текст со статус бара, а вот с прогресс бара я не представляю как получить информацию :(


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

Код:
AutoItSetOption("WinTitleMatchMode", 2)
While 1
Sleep(100)
ToolTip(ControlGetText("Internet Explorer",  "", "[CLASS:msctls_statusbar32;INSTANCE:1]"),0,0)
WEnd

Вот это выводит то же самое что и вариант который я привел выше. Но там возвращает не состояние прогресс бара, а текст отображаемый в статус баре на момент загрузки, тоесть сколько изображений осталось загрузить, какая страница открывается и тд :(


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

А я хочу сделать именно прогресс бар отражающий прогресс загрузки, теоретически замена [CLASS:msctls_statusbar32;INSTANCE:1] на [CLASS:msctls_progress32; INSTANCE:1] должна была помочь, но в этом случае скрипт не выводит совсем ничего :mad:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Belfigor
Я исправил немного свой код. Теперь у меня страница скрыта, пока не загрузится полностью, а потом передает управление функциям из библиотеки <IE.au3>.
 

HORRIBLE

Знающий
Сообщения
22
Репутация
10
Эм, ребят, а зачем так...в справке пример же есть с прогресс баром для загрузки страницы, по ObjEvent.

Код:
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>

$hWin = GUICreate("Embedded Web control Test", 300 , 123, 10,10)
$label = GUICtrlCreateLabel('Загружено: 0 %',5,5,100,20)
$progressbar1 = GUICtrlCreateProgress(5, 20, 200, 20)

GUISetState()       ;Show GUI

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

; Do some browsing activities
$oIE.Visible=1
$oIE.RegisterAsDropTarget = 1
$oIE.RegisterAsBrowser = 1
$oIE.Navigate( "http://www.AutoItScript.com/" )


While 1
        $msg = GUIGetMsg()
        Select
			Case $msg = $GUI_EVENT_CLOSE
				ExitLoop
       EndSelect
   WEnd



Func IEEvent_ProgressChange($Progress,$ProgressMax)
  $percent = Int( ($Progress * 100) / $ProgressMax )
  If $percent >= 0 And $percent <= 100 Then
    GUICtrlSetData($label,'Загружено: '&$percent&' %')
	GUICtrlSetData($progressbar1,$percent)

  EndIf
EndFunc

Или я может чего то не правильно понял?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
HORRIBLE,
А ларчик просто открывался.
Да, справку надо внимательнее читать!
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Странно, в моем хелпе вообще нету таких функции как IEEvent_... o_O
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Belfigor
Function Reference => Obj/COM Management => ObjEvent.
В справке AutoIt 3.3.6.1. К этой функции пример.
 
Автор
Belfigor

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Спасибо :laugh:
 

forfrends

Новичок
Сообщения
176
Репутация
3
Друзья, подскажите, что я делаю не так?
Вот часть кода:
Код:
$Inp1 = 380990000000
$Inp2 = 380999999999
For $i = $Inp1 To $Inp2
	$pr = Int( (($i-$Inp1) * 100) / $Inp2 )
	GUICtrlSetData($Progress1, $pr)
Next

почему-то $pr = 0
В чем может быть причина? Как правильно написать формулу?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
forfrends
Попробуйте так:
Код:
$Inp1 = 380990000000
$Inp2 = 380999999999
$iEnd = $Inp2 - $Inp1

For $i = 0 To $iEnd  + $iEnd * 0.01 Step $iEnd / 100
    $pr = Int($i * 100 / $iEnd)
    MsgBox(0, $i, $pr, 1)
Next
 

forfrends

Новичок
Сообщения
176
Репутация
3
Идея интересная, но минус в том что
$i сразу принимает значение 100000 и идет далее 200000; 300000; 400000; 500000;
мне важно что бы $i шло строго последовательно, без пропусков от 380990000000 до 380999999999 и отобразить этот процесс через статус бар
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
forfrends
Код:
Step $iEnd / 100
Уберите.
 

forfrends

Новичок
Сообщения
176
Репутация
3
Только что сам это попробовал - идет!
Чуть подредактирую и будет что надо!
Спасибо большое!
 
Верх