Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Автоматизация нажатия кнопок в окне браузера в фоновом режиме(?) (http://forum.oszone.net/showthread.php?t=149961)

zbruy 07-09-2009 18:39 1213488

Автоматизация нажатия кнопок в окне браузера в фоновом режиме(?)
 
Собственно, в 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 1213543

Цитата:

Цитата zbruy
к штудированию IE.au3 не засылайте, а то я его смотрел, ток нифига там не понял »

Если не поняли, это ещё не значит что нужно ковырять извините, извращённые методы. Поищите по форуму, есть немало примеров кликания по кнопкам и ссылкам (в справке кажется тоже должны быть).

zbruy 09-09-2009 16:46 1214919

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

HORRIBLE 09-09-2009 20:15 1215096

А можно ссылку на веб-сайт и что на нем кликать надо?

Creat0R 09-09-2009 21:10 1215129

Цитата:

Цитата zbruy
в рус. гайде на тему IE.au3 вообще нет ничего »

А по IE? :) И лучше не в рус., он пока(?) устаревший.

zbruy 10-09-2009 13:22 1215610

Сайт не дам, стесняюсь =)
Немного поплагиатил и на основе готового варианта сделал так:
Код:

#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 1215697

Так, как зациклить нашел вроде=)
Код:

#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 1215729

Цитата:

Цитата zbruy
А вот почему не пашет определение окна по процессу не рахобрался=( »

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

zbruy 10-09-2009 16:10 1215779

проводил тест, в конец извлечения имени из процесса, приписал
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 1234160

Собственно перебрал все варианты которые нашел, слегка адаптировал самый рабочий и получил на выходе такую штуку, вполне себе рабочую:
Код:

#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



Время: 15:46.

Время: 15:46.
© OSzone.net 2001-