Войти

Показать полную графическую версию : [решено] Автоматизация нажатия кнопок в окне браузера в фоновом режиме(?)


zbruy
07-09-2009, 18:39
Собственно, в AutoIt я полный нуб, но в него уже влюбился. А нужно мне организовать посыл заданной комбинации кнопок, для перемещения по веб странице в фоне(свернуто совсем или зафризена на декстопе). Мыслей много как, но вот кодю пока гадко, поатому не осилю сам. Все на что хватило ума:
MouseClick("left",258,167,1);выделяю окошко для таба, а то по умолчанию табать начинает с меню IE
Sleep(1500);эт чтоб страница подгрузиться немного успела
Send("{TAB}");по хорошему давать задержку после каждого нажати, но так тож канает и немного времени экономит
Send("{TAB}")
Sleep(500)
Send("{TAB}")
Send("{TAB}")
Sleep(500)
Send("{TAB}")
Send("{TAB}")
Sleep(500)
Send("{TAB}")
Send("{TAB}")
Sleep(500)
Send("{TAB}")
Send("{TAB}")
Sleep(1500)
Send("{ENTER}")
Sleep(4000)
и по-новой=)

Если есть возможность прямого обращения к кнопке на сайте, то через него можно(каждая кнопка это ссылка на новую страницу, и возможно просто забивать его как адрес), аля определяем адрес кнопки копируем его в строку адреса переходим. Или даже тупое повторение моего кода, только для зафризенного окна, пробовал так:
WinWaitActive(такое-то окно, '', 3)
$hWnd = WinGetHandle(такое-то окно)
WinSetState($hWnd, '', @SW_DISABLE)
ControlSend($hWnd, "","", "{TAB}")
ControlSend($hWnd, "","", "{TAB}")
Sleep(15500)
ControlSend($hWnd, "","", "{TAB}")
ControlSend($hWnd, "","", "{TAB}")
Sleep(500)
ControlSend($hWnd, "","", "{TAB}")
ControlSend($hWnd, "","", "{TAB}")
Sleep(500)
ControlSend($hWnd, "","", "{TAB}")
ControlSend($hWnd, "","", "{TAB}")
Sleep(500)
ControlSend($hWnd, "","", "{TAB}")
ControlSend($hWnd, "","", "{TAB}")
Sleep(500)

ControlSend($hWnd, "","", "ENTER")
WinSetState($hWnd, '', @SW_ENABLE)
Но беда в том, что под фризом, ни только не получается определить зону применения таба(нажатия до выделения нужного элемента увеличиваются в 2 раза), но и страница не может обновиться, а снимать фриз на обновление и ставить вновь как-то глупо. Ведь суть применения задачи, свободная работа на компе с запущенным скриптом. И что-бы одно не мешало другому.
Подошло бы и кликанье в область окна с кнопкой(ток чтоб мышь при этом не занимало) вообщем вот так=)
Буду рад любой помощи, особенно с подробными комментариями.
ЗЫ только к штудированию IE.au3 не засылайте, а то я его смотрел, ток нифига там не понял...

Creat0R
07-09-2009, 20:11
к штудированию IE.au3 не засылайте, а то я его смотрел, ток нифига там не понял »
Если не поняли, это ещё не значит что нужно ковырять извините, извращённые методы. Поищите по форуму, есть немало примеров кликания по кнопкам и ссылкам (в справке кажется тоже должны быть).

zbruy
09-09-2009, 16:46
Смотрел я похожие статейки, вот в том и проблема, что нифига там не понял=(
а в рус. гайде на тему IE.au3 вообще нет ничего...

HORRIBLE
09-09-2009, 20:15
А можно ссылку на веб-сайт и что на нем кликать надо?

Creat0R
09-09-2009, 21:10
в рус. гайде на тему IE.au3 вообще нет ничего »
А по IE? :) И лучше не в рус., он пока(?) устаревший.

zbruy
10-09-2009, 13:22
Сайт не дам, стесняюсь =)
Немного поплагиатил и на основе готового варианта сделал так:
#Include <WinAPI.au3>

$hWnd = WinGetHandle("нужный сайт")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{ENTER}")
_SendMessage($hWnd, 0x6, 0x1)
Sleep(3000)
А как его теперь зациклить?=) а то go to что-то не помогает
И еще, пытался прикрутить поиск окна по процессу, т.к. планирую запустить несколько окон, как вариант в разных браузерах, пока прихобится создавать в виндовс учетки, тоже извращентство. Ну так вот, тоже нарыл тут код:
$sWindow = _ProcessGetWindow("сhrome.exe", 1)
ConsoleWrite($sWindow & @CRLF)

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc
но оно не работает=( а пишет вот чаво:
Line 64
(File "C:\Documents and 5ettings\Zbruy\Pa6o4MM стол\Копия сайт тест.аиЗ")
: Func _ProcessGetWindow($iPID, $iRet=-l)
Error: Duplicate function name.

zbruy
10-09-2009, 14:44
Так, как зациклить нашел вроде=)
#Include <WinAPI.au3>
$i = 1
While $i <= 10
$hWnd = WinGetHandle("сайт")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{ENTER}")
_SendMessage($hWnd, 0x6, 0x1)
Sleep(3000)
WEnd
А вот почему не пашет определение окна по процессу не разобрался=(

Medic84
10-09-2009, 15:26
А вот почему не пашет определение окна по процессу не рахобрался=( »

именно такой код как у тебя выше лично у меня работает...

zbruy
10-09-2009, 16:10
проводил тест, в конец извлечения имени из процесса, приписал
MsgBox(64, "Tutorial", $hWnd)
так сначало оно мне давало имя типа х*хххххххххх, а после перезагрузки браузера вообще пустое окно. Видимо я не правильно пытался прилепить комбинацию кнопок к конкретному окну поэтому и ошибка выскакивала, скрипт имел вид
$hWnd = _ProcessGetWindow("сhrome.exe", 1)
ConsoleWrite($hWnd & @CRLF)

Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]

If IsString($iPID) Then $iPID = ProcessExists($iPID)

For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle

If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]

Return $aRet
EndIf
Next

Return SetError(1, 0, $aRet)
EndFunc
SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB}")
_SendMessage($hWnd, 0x6, 0x1)

тоесть я имя окна привязал как переменную $hWnd а так ли оно на самом деле?

zbruy
04-10-2009, 12:22
Собственно перебрал все варианты которые нашел, слегка адаптировал самый рабочий и получил на выходе такую штуку, вполне себе рабочую:
#Include <WinAPI.au3>
$g_szVersion = "My Script 1.0000"
If WinExists($g_szVersion) Then Exit
AutoItWinSetTitle($g_szVersion)
Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{Esc}" , "MyExit")

While 1=1
$hWnd = WinGetHandle("Имя окна")
_SendMessage($hWnd, 0x6, 0x1)
ControlSend($hWnd, "", "", "{TAB 10}")
_SendMessage($hWnd, 0x6, 0x1)
Sleep(100)
ControlSend($hWnd, "", "", "{ENTER}")
Sleep(3000)
WEnd;

Func TogglePause()
$Paused = NOT $Paused
While $Paused
sleep(100)
ToolTip('скрипт на паузе',0,0)
WEnd
ToolTip("")
EndFunc
Func MyExit()
MsgBox(0, "Сообщение системы", "скрипт завершен")
Exit
EndFunc




© OSzone.net 2001-2012