Что нового

Функция MouseMove\Click вводит скрипт в ступор. Как с этим бороться?

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Снова я!.. :stars:

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


Код:
Func AutoBuff()
	While Not $STOP
		Local $year = IniRead($BuffListPath, "Last Buff Time", "Year", 00001)
		Local $month = IniRead($BuffListPath, "Last Buff Time", "Month", 00001)
		Local $day = IniRead($BuffListPath, "Last Buff Time", "Day", 00001)
		Local $hour = IniRead($BuffListPath, "Last Buff Time", "Hour", 00001)
		Local $min = IniRead($BuffListPath, "Last Buff Time", "Min", 00001)
		Local $nodate = False
		Local $iDiff
		If $year = 00001 or $month = 00001 or $day = 00001 or $hour = 00001 or $min = 00001 Then
			$nodate = True
		EndIf
        $sOldDate = StringFormat('%s/%s/%s %s:%s:00', $year, $month, $day, $hour, $min)
        $iDiff = _DateDiff('n', $sOldDate, _NowCalc())
		Select
			Case $iDiff > 360 Or $nodate = True
				WinActivate($GameWindowName)
				If WinActivate ($GameWindowName) Then
					$S = 1
					While $S <= 9 And Not $STOP
						$spotscrd = IniReadSection($BuffListPath, "Sector "&$S)
						If Not @error Then
							Send ($S)
							Sleep (1000)
							Local $i = 1
							$cnt = 0
							While $cnt < $spotscrd[0][0] / 2 And Not $STOP
								CheckBuff()
								Switch $checkbuff
									Case False
										UseBasketBuff()
									Case True
										If Not $STOP Then
											MouseClick( "left", $spotscrd[$i][1], $spotscrd[$i+1][1], 1, $MouseSpeed)
											$i = $i + 2
											$cnt = $cnt + 1
											Sleep (2500)
										EndIf
								EndSwitch
							WEnd
						EndIf
						$S = $S + 1
						If $S = 10 Then
							LastBuff()
						EndIf
					WEnd
				Else
					MsgBox(0, $err, $gwnf)
				EndIf
			Case Else
				While $iDiff < 360 and Not $STOP
					Sleep(200)
					$iDiff = _DateDiff('n', $sOldDate, _NowCalc())
				WEnd
		EndSelect
	WEnd
EndFunc


Код:
Func UseBasketBuff()
	Local $i = 0
	Local $buff
	Local $x = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu X", 00001)
	Local $y = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Y", 00001)
	Local $x2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects X", 00001)
	Local $y2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Effects Y", 00001)
	Local $smbx1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner X", 00001)
	Local $smby1 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Left Corner Y", 00001)
	Local $smbx2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner X", 00001)
	Local $smby2 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Box Right Corner Y", 00001)
	Local $x3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down X", 00001)
	Local $y3 = IniRead($GameInfoIniPath, "Coordinates of Objects", "Star Menu Arrow Down Y", 00001)
	If $x = 00001 Or $y = 00001 Or $x2 = 00001 Or $y2 = 00001 Or $smbx1 = 00001 Or $smby1 = 00001 Or $smbx2 = 00001 Or $smby2 = 00001 or $x3 = 00001 or $y3 = 00001 Then
		MsgBox(0, $err, $crgi)
		_Stop()
	Else
		If Not $STOP Then
			MouseClick("left", $x, $y, 1, $MouseSpeed)
			Sleep (250)
			MouseClick("left", $x2, $y2, 1, $MouseSpeed)
			Sleep (250)
		EndIf
		Do
			Local $buffcrd = ImgSearch($smbx1, $smby1, $smbx2, $smby2, 0x8DA02A, 1, 3)
			If @error and Not $STOP Then
				$buff = False
				MouseClick("left", $x3, $y3, 1, $MouseSpeed)
				Sleep (250)
			Else
				If Not $STOP Then
					$buff = True
					MouseClick("left", $buffcrd[0], $buffcrd[1], 1, $MouseSpeed)
					Sleep (1000)
				EndIf
			EndIf
			$i = $i + 1
		Until $i >= 15 Or $buff = True Or $STOP = True
		If $Stop = True Then
			$buff = True
		EndIf
		If $buff = False Then
			MsgBox(0, $err, $nobuff)
			_Stop()
		EndIf
	EndIf


Перед вами 3 куска моего скрипта. Все работает хорошо. НО! Такое жирное, толстое НО.
Обратил внимание, что функции MouseClick \ MouseMove вводят скрипт в ступор, не могут выполниться в том случае, если во время нажатия на кнопку Автобаф в GUI моего скрипта и на момент начала выполнения функции AutoBuff вплоть до перехода первой строчке, использующей функцию MouseMove\MouseClick, мышка находится за пределами окна, в котором скрипт должен работать.

Как это себя проявляет: для начала скажу, что скрипт работает с браузерным окном. Яркий пример: если браузер свернуть в окно и растянуть на половину (левую) экрана, а в правой развернуть окошко с GUI и нажать на кнопку автобаф (тут окно с GUI сворачивается и активируется окно браузера), то изначально позиция мышки будет находиться вне окна браузера на момент начала работы. Скрипт доходит до первой строчки, в которой есть функция MouseClick\Move (пробовал с обоими вариантами) и скрипт зависает на глухо до тех пор, пока я не сделаю своими руками "драг анд дроп" (передвину часть флеш объекта в браузере). Затем все идет нормально.

Дополнительно: сейчас тестировал подобно тому, как описывал выше. Если запускать из SciTE - такой глюк редко появляется. Если запускать скомпилированную версию скрипта, то такой глюк возникает наиболее часто. В последние несколько раз он даже не зависел от того, находится ли мышка над окном браузера момент начала скрипта или нет.
Так же у тестера подобный глюк встречался. Я ему когда в первый раз дал скрипт (он даже был тогда раза 2 короче и меньше функций использовалось в нем), он у него сразу не работал, он его так же "реанимировал" драг энд дроп действием. Потом он сделал то, сам не знает что, с тех пор он не жаловался на данный глюк.

Кто-нибудь подобные моменты замечал? Есть возможность с ними бороться? Может быть что-то следует поменять в принципе написания скрипта для сведения к минимуму подобных глюков?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Почему ты используешь MouseClick а не ControlClick ???
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
как минимум потому, что в браузере запущена флешка и я работаю именно с флеш приложением.
 
Верх