Что нового

поиск пикселя определенного цвета в бесконечном цикле!!!

Автор
F
Сообщения
18
Репутация
-1
вот ваш код в него я подставил координаты и цвет который мне выдал Autolt v3 Window Info
Код:
OnAutoItExitRegister('_Exit')
#include <IE.au3>

Opt("PixelCoordMode", 2)
Opt("MouseCoordMode", 2)

Dim $iCount = 0
Dim $iColor = "0x6A9A9C"            ; Цвет пикселя, на который нужно реагировать
Dim $iX  = "232"                    ; Х - координата пикселя, на который нужно реагировать
Dim $iY = "553"                     ; Y - координата пикселя, на который нужно реагировать
Dim $hWin = ""                      ; Hendle - окна с игрой
Dim $sTitle = "[IEFrame]"     ; Текст заголовка вашего окна с запущенной игрой

$oIE = _IECreate("http://kolonisty.ru/")

AdlibRegister("_Listener")

While 1
    If Not WinExists($sTitle) Then
        Exit
    EndIf
    Sleep(100)
WEnd

Func _Listener()

    Local $o_Action

    If WinActive($sTitle) Then
        If _ColorListener($iColor, $iX, $iY, $hWin) Then
            If $iCount = 5 Then Exit
            MouseClick("Left", $iX, $iY)
            $iCount +=1
            Return 1
        EndIf
    EndIf
EndFunc ;==>_Listener

Func _ColorListener($i_Color, $i_X, $i_Y, $h_Win = 0)

    Local $i_Frozen = 0

    While Hex($i_Color) = Hex(PixelGetColor($i_X, $i_Y, $h_Win))
        If Not $i_Frozen Then
            ;ConsoleWrite("Цвет совпал! " & Hex(PixelGetColor($i_X, $i_Y, $hWin)) & @CRLF)
            Return 1
            $iFrozen = Not $i_Frozen
        EndIf
    Sleep(250)
    WEnd

    Return 0
EndFunc ;==>_ColorListener

Func _Exit()
    AdlibUnRegister("_Listener")
EndFunc ;==>_Exit
а вот что он мне выдал [info]>>>> Window <<<<
Title: Колонисты - Microsoft Internet Explorer
Class: IEFrame
Position: 29, 105
Size: 460, 796
Style: 0x16CF0000
ExStyle: 0x00000100
Handle: 0x00070732

>>>> Control <<<<
Class: Internet Explorer_Server
Instance: 1
ClassnameNN: Internet Explorer_Server1
Name:
Advanced (Class): [CLASS:Internet Explorer_Server; INSTANCE:1]
ID:
Text:
Position: 0, 146
Size: 452, 593
ControlClick Coords: 232, 553
Style: 0x56000000
ExStyle: 0x00000000
Handle: 0x000807DA

>>>> Mouse <<<<
Position: 232, 699
Cursor ID: 0
Color: 0x6A9A9C

>>>> StatusBar <<<<[/info] тоесть я тыкал на кнопку в игру и вписывал эти координаты и цвет пикселя!далее запускаю скрипт открывает адрес саита и все тишина!ошибок не выдает но и не ищет и не кликает!
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я только начал осваивать AutoIt и, тем более, не спец по IE.au3.
Можно я задам пару вопросов, не исключительно ТС, а всем, скорее с целю самому разобраться.

1. У Вас идут последовательность вызовов:
Код:
Dim $hWin = ""

Код:
_ColorListener($iColor, $iX, $iY, $hWin)

Код:
_ColorListener($i_Color, $i_X, $i_Y, $h_Win = 0)
     PixelGetColor($i_X, $i_Y, $h_Win)

Я не совсем понимаю с каким параметром в итоге вызывается PixelGetColor - с "" или с 0 ?
Насколько корректно вызывать PixelGetColor с таким параметром hwnd ?

2. Насколько я понимаю, $iFrozen всегда равно 0
Код:
If Not $i_Frozen Then
            ;ConsoleWrite("Цвет совпал! " & Hex(PixelGetColor($i_X, $i_Y, $hWin)) & @CRLF)
            Return 1
            $iFrozen = Not $i_Frozen
        EndIf

В чем смысл использования переменной $iFrozen ? И вообще что полезного делает такой код?
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
some ("some1", "some2")
some ()
Func some ($_one = "one", $_two = "two")
	ConsoleWrite ($_one &" "& $_two&@CR)
EndFunc

запусти и смотри в консоль, т.е. если мы НЕ дали в функцию данные она берёт default (в нашем случае это $_one = "one", $_two = "two"), в противном случае это то что мы отдали функции
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я понимаю что такое параметры по умолчанию.
Я не понимаю как может параметр по умолчанию стоять =0, а функция вызываться с ="".
И самое главное - для PixelGetColor это корректный вызов?
Код:
PixelGetColor($x,$y,"")
 

running-frag

why me?
Сообщения
441
Репутация
60
нажми на PixelGetColor в своём же посте, и прочитай хэлп по нему :-X

Код:
$_pause = False
If Not ($_pause) Then
	; выполняется только когда значение выражения Not ($_pause) будет True
	; в нашем случае Not ($_pause) будет True (подробнее смотри функцию Not ())
	; Logical NOT operation.  e.g. NOT (1) = (False) выдержка из хэлпа
	Return 1
	; вот это вот не знаю что
	; но вообще механика Return это выход из функции (возвращаем либо ничего либо значение, в нашем случае это 1)
    $_pause = Not ($_pause)
	; присваиваем переменной её же противоположность, т.е. если было True то станет False и наоборот
EndIf
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
running-frag , Вы поняли вопрос?
Перевожу:

1. Для дескриптора окна корректны значения 0 или "" ? (главным образом "")

2. Вы понимаете что в Вашем коде значение $_pause всегда равно False ?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
Честно говоря, я тоже не могу понять, зачем в функции _ColorListener() нужна переменная $i_Frozen. :wacko:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
1. К счастью в Autoit переменные типа Variant. Autoit автоматом определяет тип переменным в зависимости от задачи. Я просто в начале присвоил переменной
Код:
Dim $hWin = ""
пустое значение. Так что это на ваше усмотрение. Думаю правильнее, было бы присвоить всё же "0" потому как дескриптор окна всё же число.
2. Да тут вы правы. Тут достаточно.
Код:
Return 1
Это осталось от моего эксперимента, когда цикла While ещё небыло. Спасибо за замечание, поправлю.
 

running-frag

why me?
Сообщения
441
Репутация
60
C2H5OH [?]
1. Для дескриптора окна корректны значения 0 или "" ?2. Вы понимаете что в Вашем коде значение $_pause всегда равно False ?
1. 0 и "" оба равны False, если в PixelGetColor отдать этот False ничего не будет, т.к. что с ним что без, но если идёт речь каком то целенаправленном окне тогда туда записываться заместь пустой строки ("") наш хэндл, другими словами Garrett сделал опциональный вариант для общей картины (активного окна) и для целенаправленного хэндла (окна)

2. я понимаю, какой код дали, тот я и описал (я не модер, что б разжёвывать как детям малым)

upd: @Frol никогда не называйте функции численными значениями
 

running-frag

why me?
Сообщения
441
Репутация
60
OffTopic:
честно говоря не понмаю зачем такие сложности WinActivate () и opt("MouseCoordMode", 2) должно хватить с головой для примера
 
Автор
F
Сообщения
18
Репутация
-1
Frol , почему Вы молчите? В абсолютных координатах работает?


Вписывать данные нужно отсюда:
>>>> Mouse <<<<
Position: 232, 699
Cursor ID: 0
Color: 0x6A9A9C
я от туда пробовал я все координаты от туда пробовал не рабит и все тут!вот и не понимаю почему все ж правильно !можете проверить сами !вернее попробовать запустить код
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Frol [?]
не рабит и все тут!
Я не поленился и сделал swf. Как видите, всё прекрасно работает.
[flash=1089,779]http://mr-garrett.narod.ru/files/test.swf[/flash]
 
Автор
F
Сообщения
18
Репутация
-1
может я что не правильно делаю!открываю в SciTE -Tools-Go и попер


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

просто открывается браузер
Код:
OnAutoItExitRegister('_Exit')
#include <IE.au3>

Opt("PixelCoordMode", 2)
Opt("MouseCoordMode", 2)

Dim $iCount = 0
Dim $iColor = "0x286BDF"            ; Цвет пикселя, на который нужно реагировать
Dim $iX  = "218"                    ; Х - координата пикселя, на который нужно реагировать
Dim $iY = "733"                     ; Y - координата пикселя, на который нужно реагировать
Dim $hWin = ""                      ; Hendle - окна с игрой
Dim $sTitle = "[IEFrame]"     ; Текст заголовка вашего окна с запущенной игрой

$oIE = _IECreate("http://kolonisty.ru/")

AdlibRegister("_Listener")

While 1
    If Not WinExists($sTitle) Then
        Exit
    EndIf
    Sleep(100)
WEnd

Func _Listener()

    Local $o_Action

    If WinActive($sTitle) Then
        If _ColorListener($iColor, $iX, $iY, $hWin) Then
            If $iCount = 5 Then Exit
            MouseClick("Left", $iX, $iY)
            $iCount +=1
            Return 1
        EndIf
    EndIf
EndFunc ;==>_Listener

Func _ColorListener($i_Color, $i_X, $i_Y, $h_Win = 0)

    While Hex($i_Color) = Hex(PixelGetColor($i_X, $i_Y, $h_Win))
		ToolTip("Скрипт работает!", 215, 693)
            ;~  ConsoleWrite("Цвет совпал! " & Hex(PixelGetColor($i_X, $i_Y, $hWin)) & @CRLF)
            Return 1

    Sleep(250)
    WEnd

    Return 0
EndFunc ;==>_ColorListener

Func _Exit()
    AdlibUnRegister("_Listener")
EndFunc ;==>_Exit
 
Автор
F
Сообщения
18
Репутация
-1
идем другим путем !!!пытаюсь прервать скрипт и выполнить переход по ссылке после чего продолжить выполнение скрипта
Код:
_1() ; Вызов функции
Func  _1()
    Local $i
    While 1
        $i += 1
        ConsoleWrite($i & @CRLF)
        Sleep(1000)
    _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=bots&rnd=1463178')
    _IELoadWait ($oIE)
Send("{TAB 11}")
Send("{ENTER}")
_IELoadWait ($oIE)
Send("{TAB 1}")
Send("{ENTER}")
_IELoadWait ($oIE)
Wend
EndFunc
$begin = TimerInit()
While 1
    If TimerDiff($begin) > 2 * 60 * 1000 Then
         _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=meshok&bl=2&do=1&doo=3&wher=4&list=1&idm=1487&rnd=2113963')
        Sleep(1000)
        $begin = TimerInit()
    EndIf
WEnd
и опять не получается!должен каждые 2 минуты останавливать переходить и потом продолжать работу
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Frol [?]
и опять не получается!
Код:
$begin = TimerInit()
; Основной цикл скрипта
While 1
	;...
	ConsoleWrite( "Что-то делаем..." & @CRLF )
	;...
    If TimerDiff($begin) > 10000 Then
		; _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=meshok&bl=2&do=1&doo=3&wher=4&list=1&idm=1487&rnd=2113963')
		ConsoleWrite( "Переход по ссылке..." & @CRLF )
		; На всякий пожарный ждём загрузки
		; _IELoadWait($oIE)
        $begin = TimerInit()
    EndIf
	Sleep(3000)
WEnd
 
Автор
F
Сообщения
18
Репутация
-1
опять не хочет работать каждые 10000 мс
Код:
$begin = TimerInit()
_1() ; Вызов функции
Func  _1()
    Local $i
    While 1
        $i += 1
        ConsoleWrite($i & @CRLF)
        Sleep(1000)
    _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=bots&rnd=1463178')
    _IELoadWait ($oIE)
Send("{TAB 11}")
Send("{ENTER}")
_IELoadWait ($oIE)
Send("{TAB 1}")
Send("{ENTER}")
_IELoadWait ($oIE)
Wend
EndFunc
; Основной цикл скрипта
While 1
    ;...
    ConsoleWrite( "Что-то делаем..." & @CRLF )
    ;...
    If TimerDiff($begin) > 10000 Then
        ; _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=meshok&bl=2&do=1&doo=3&wher=4&list=1&idm=1487&rnd=1571443')
        ConsoleWrite( "Переход по ссылке..." & @CRLF )
        ; На всякий пожарный ждём загрузки
        ; _IELoadWait($oIE)
        $begin = TimerInit()
    EndIf
    Sleep(3000)
WEnd
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Frol [?]
опять не хочет работать
У вас в функции цикл, из которого нет выхода!!! И что у вас не работает? Второй цикл? Так он и не будет работать, потому как у вас из цикла, который в функции нет выхода!!!

Что именно вы хотите!!!


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

Код:
Dim $i = 0
Dim $begin = TimerInit()

; Основной цикл скрипта
While 1

	$i += 1
	ConsoleWrite($i & @CRLF)
	Sleep(1000)
	_IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=bots&rnd=1463178')
	_IELoadWait ($oIE)
	Send("{TAB 11}")
	Send("{ENTER}")
	_IELoadWait ($oIE)
	Send("{TAB 1}")
	Send("{ENTER}")
	_IELoadWait ($oIE)

    If TimerDiff($begin) > 10000 Then
        _IENavigate($oIE, 'http://kolonisty.ru/main.php?blok=meshok&bl=2&do=1&doo=3&wher=4&list=1&idm=1487&rnd=1571443')
        ; На всякий пожарный ждём загрузки
        _IELoadWait($oIE)
        $begin = TimerInit()
    EndIf
    Sleep(3000)
WEnd
 

running-frag

why me?
Сообщения
441
Репутация
60
OffTopic:
нефигасебе, много восклицательных знаков это видать заразно!!!!!!1111адынадынадын


Garrett забей, пусть воюет сам с тем что "сам" написал :smile: как я понимаю примеры ему дали более чем доходчивые
 
Верх