Что нового

[Сеть, интернет] Как отловить окно, появляющееся при нажатии кнопки в IE

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
При выполнении следующего кода появляется стандартное окно Windows с диалогом выбора файла. У меня никак не получается это окно отследить. Скрипт зависает на строке 546 или на строке 3673 IE.au3 до тех пор, пока это окно не закрыть вручную. Подскажите, пожалуйста, как это окно отследить.
Спасибо.
Код:
#include <IE.au3>

Opt("TrayIconDebug", 1)

$oIE = _IECreate("http://www.multiupload.com/")
$oInputs = _IETagNameGetCollection($oIE, 'input')
For $oInput In $oInputs
	If $oInput.type == 'file' And $oInput.name == "file_0" Then
		;$oInput.Click()
		_IEAction($oInput, 'click')
		ExitLoop
	EndIf
Next
MsgBox(0, "", WinExists("Выбор файла для выгрузки"))
 

El Panda

Продвинутый
Сообщения
101
Репутация
59
Другой вариант решения, правда в IE8 работать не будет.

Код:
#include <IE.au3>

Opt("TrayIconDebug", 1)

$file_path = @SystemDir&"\calc.exe"
$oIE       = _IECreate("http://www.multiupload.com/")
$oInputs   = _IETagNameGetCollection($oIE, 'input')
For $oInput In $oInputs
    If $oInput.type == 'file' And $oInput.name == "file_0" Then
            WinActivate(_IEPropertyGet($oIE,"hwnd"))
            _IEAction($oInput, 'focus')
			$OldClip = ClipGet()
			ClipPut($file_path)
			Send("^v")
			ClipPut($OldClip)
			$oIE.document.parentWindow.execScript("startupload()", "javascript")
			_IELoadWait($oIE)
			ExitLoop
        ExitLoop
    EndIf
Next
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
El Panda
У меня стоит IE8. К сожалению, Ваш код не работает у меня. :(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Попробуйте так:
Код:
#include <IE.au3>

Opt("WinTitleMatchMode", 4)

$oIE = _IECreate("http://www.multiupload.com/")
$oInputs = _IETagNameGetCollection($oIE, 'input')
For $oInput In $oInputs
    If $oInput.type == 'file' And $oInput.name == "file_0" Then
        _IEAction($oInput, 'click')
        ExitLoop
    EndIf
Next
MsgBox(0, "", WinExists("[CLASS:#32770]"))
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
Увы :(, так же, как у меня, на той же строке 546 зависает.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles сказал(а):
Garrett
Увы :(, так же, как у меня, на той же строке 546 зависает.
Странно :scratch:, у меня всё нормально.
Может поменять IE.au3? Попробуйте заменить, на новую из дистрибутива Autoit?
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
IE.au3 поменял - то же самое, не работает. MsgBox с "единицей" появляется только после закрытия окна "Выбор файла для выгрузки" вручную. И единица появляется потому, что у меня есть открытые окна "[CLASS:#32770]".
А у Вас MsgBox с "единицей" появляется одновременно с окном "Выбор файла для выгрузки"?
Может быть дело в том, что у меня AutoIt 3.3.6.0, а у Вас 3.3.4.0?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
А у Вас MsgBox с "единицей" появляется одновременно с окном "Выбор файла для выгрузки"?
Ах, вот в чём дело. Я теперь понял вас! Нет конечно же, у меня тоже скрипт продолжает работать, только после закрытия диалога сохранения файлов! Это потому что диалог не даёт скрипту работать дальше, пока не выполнит действия :( Меня тоже этот вопрос мучает давно :smile: Где-то на форуме, я уже по-моему, встречал успешное решение этого. Точно не помню.
Однако MsgBox в вашем скрипте отлавливает именно диалоговое окно! У меня, например, нет других открытых окон, и всё работает! Но поздно ;D
 
Автор
madmasles

madmasles

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

$aWind = WinList("[Class:#32770]")
_ArrayDisplay($aWind)
10 штук окон находит, хотя ничего не открываю.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
Да вы правы. Этот класс по умолчанию принадлежит всем диалоговым окнам, даже тем которые в Tray резидентом сидят. :(
 
Автор
madmasles

madmasles

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

Opt("TrayIconDebug", 1)
Run(@ScriptDir & "\My.exe")
$oIE = _IECreate("http://www.multiupload.com/")
$oInputs = _IETagNameGetCollection($oIE, 'input')
For $oInput In $oInputs
	If $oInput.type == 'file' And $oInput.name == "file_0" Then
		;$oInput.Click()
		_IEAction($oInput, 'click')
		ExitLoop
	EndIf
Next
$hIE = _IELoadWait($oIE)
MsgBox(0, "11", $hIE)
My.exe следующего содержания:
Код:
WinWait("Выбор файла для выгрузки")
If Not WinActive("Выбор файла для выгрузки") Then WinActivate("Выбор файла для выгрузки")
WinWaitActive("Выбор файла для выгрузки")
ControlSetText("Выбор файла для выгрузки", "", "[CLASS:Edit; INSTANCE:1]", @ScriptDir & "\1.au3")
ControlClick("Выбор файла для выгрузки", "", "[CLASS:Button; INSTANCE:2]")
If Not WinActive("[Class:IEFrame]") Then WinActivate("[Class:IEFrame]")
$hWind = WinWaitActive("[Class:IEFrame]")
MsgBox(0, "22", $hWind, 3)
У меня работает. :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Такое решение у меня созрело сразу, однако я полагал, что задача стоит обойтись одним скриптом.
P.S. Интересно почему Autoit отдаёт приоритет диалоговым окнам и останавливает работу скрипта? :(
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
Хотелось бы, конечно, одним скриптом все сделать, но, за неимением барышни... :smile:

OffTopic:
Хотя... какая разница. У меня три скрипта отключают в NOD-32 защиту от вирусов, главное, чтобы работало.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles
Понятно :smile:

Однако я все-таки решил задачу, правда, прибегнул к "ботоводческим технологиям" но, всё же.
В процессе многие вещи стали для меня более ясными. К сожалению, некоторые из них не обойти! Вот, например, пользуясь IE.au3 мы тем самым используем COM объект "InternetExplorer.Application". Отсюда следует, что все события теперь принадлежат AutoIt, так как он использует COM объект, поэтому, когда открыто окно "Выбор файла" вызванное AutoIt`ом, то он ждёт от него событий, и скрипт зависает в ожидание.
Пример, который я привожу, запускает IE отдельным приложением, а скрипт работает параллельно, выполняя всё то, что от него требуется.
Кстати, я пытался использовать _IEAttach, к уже существующему окну, не создавая его AutoIt`ом, всё равно, AutoIt перехватывает всё управление событиями "InternetExplorer.Application" на себя.

Вот такие мои наблюдения.
Буду рад, если кто-нибудь выскажет свои мысли, или поправит меня.

Код:
Opt("PixelCoordMode", 0)
Opt("MouseCoordMode", 0)

If Not WinExists("Multiupload.com -")  Then
    Run("""C:\Program Files\Internet Explorer\iexplore.exe"" http://www.multiupload.com/")
	WinWait("Multiupload.com -")
EndIf

WinActivate("Multiupload.com -")

$aClientSize = WinGetClientSize("Multiupload.com -")

$aCoord = PixelSearch( 0, 0, $aClientSize[0], $aClientSize[1], 0x8C9DAB )

If Not @error Then
	MouseClick("left", $aCoord[0], $aCoord[1])
EndIf

WinWait("Выбор файла")
		MsgBox(0, "Вот теперь всё работает!", WinExists("Выбор файла"))
		WinKill("Выбор файла")
Exit


P.S. В свойствах ярлыка IE поставьте "Окно: Развёрнутое на весь экран".
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett
Все гениальное просто! :beer:

Скажите, пожалуйста, как Вы определили цвет 0x8C9DAB?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
madmasles [?]
Скажите, пожалуйста, как Вы определили цвет 0x8C9DAB?

Код:
Opt("PixelCoordMode", 0)
Opt("MouseCoordMode", 0)

HotKeySet("!q", "_Exit")

While 1
	$aPos = MouseGetPos()
	$iPixelColor = PixelGetColor( $aPos[0] , $aPos[1])
	ToolTip("Координаты x,y и цвет: " & $aPos[0] & " x " & $aPos[1] & " x " & Hex($iPixelColor, 6),$aPos[0] & " x " & $aPos[1])
WEnd

Func _Exit()
	Exit
EndFunc



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

Кстати, у Yashied`а есть хорошая утилита, ей просто нужно сделать перекрестие точно по середине, отображение координат и цвета, и назначить горячие клавиши для занесения выбранного цвета в буфер обмена. Классная вещица выйдет! :thumbs_up:
 

timsky

Осваивающий
Сообщения
93
Репутация
28
Вообще, 546-я строка указывает на ф-ю _IELoadWait(). Я как-то тоже с этим столкнулся, думал подправить сам IE.au3, но функция _IEAction для 'CLICK' содержит только это:
Код:
Case $s_action = "click"
			If __IEIsObjType($o_object, "documentContainer") Then
				__IEErrorNotify("Error", "_IEAction", "$_IEStatus_InvalidObjectType")
				Return SetError($_IEStatus_InvalidObjectType, 1, 0)
			EndIf
			$o_object.Click()
			Return SetError($_IEStatus_Success, 0, 1)


Как запускается IELoadWait()? Откуда?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
timsky сказал(а):
Garrett [?]
А с чего вы взяли что IE.au3 нужно править?! Она работает, как положено!
Чтобы при ожидании не срабатывала функция IELoadWait.
Ну, во первых,
Код:
_IELoadWait

нужна для того, чтобы создать ожидание полной загрузки документа!

Если вам не нужно ожидание полной загрузки документа, то используйте следующий код:
Код:
_IECreate ("www.autoitscript.com", 1, 1, 0)

Всё просто!
 
Верх