Что нового

Не всегда срабатывает MouseClick. Подскажите варианты причин

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.
Ниже под спойлером выложил скрипт, при работе которого не всегда срабатывает MouseClick()

При этом у себя (win 10, x64) программа работает идеально. Но на win7, x64 возникают казусы. MouseClick() отрабатывает лишь периодически. Т.е. в какой то момент может сработать пару раз, моет сработать один раз, может работать достаточно долго. А затем паузы. Иногда большие.

Скрипт должен отрабатывать в игре, в открытом (оконный с максимальным разрешением) клиенте.
Цвет точно соответствует, хотя при этом я делаю проверку на разброс в 50 оттенков. Проверку цвета делал. Потому расхождения цвета более не рассматриваю (вечером запущу ежесекундное считывание цвета для пущей уверенности).
Опять же, на другом компьютере работает.

Может ли Windows Aero влиять на подобное?
Какие еще могут быть причины?
Просьба подсказать возможные варианты решения? куда посмотреть, куда копать?


Код:
#RequireAdmin

While 1
	If _CheckColor(Hex(PixelGetColor($500,500), 6), 'BC3FFF') Then MouseClick("left")
	EndIf
WEnd

Func _CheckColor($color, $arClr, $iVari = 50)
	Local $i
	Local $result = 0
	If StringLeft($color, 2) <> '0x' Then $color = '0x' & $color
	$arClr = StringSplit($arClr, ',', 2)
	For $j=0 To UBound($arClr)-1
		If StringLeft($arClr[$j], 2) <> '0x' Then $arClr[$j] = '0x' & $arClr[$j]
		For $i = 0 To 2
			If Abs(BitAnd(BitShift($color, $i * 8), 255) - BitAnd(BitShift($arClr[$j], $i * 8), 255)) > $iVari Then
				$result +=1
				ExitLoop
			EndIf

		Next
	Next
	If $result < UBound($arClr) Then
		Return True
	Else
		Return False
	EndIf
EndFunc
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Почему не упростить до:

Код:
While 1
	$coord = PixelSearch(0, 0, @DesktopWidth, @DesktopHeight, 0xFF0000, 50, 1)
	if Not @error Then
		MouseClick("LEFT", $coord[0], $coord[1], 1, 1)
	EndIf
WEnd
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
:smile: я особо не задумывался над оптимизацией. Для меня важнее в первую очередь реализовать основной функционал. И уже затем "сглаживать" код.
А приведенный пример не подходит как минимум по причине того, мне не нужно искать пиксель в области, а нужно проверить его по цвету с разбросом оттенков.
А PixelSearch работает для области в 1 пиксель? Т.е., грубо говоря, если 4 первых параметра функции совпадут, функция будет работать?


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

По времени выполнения одинаково работаю в пределах от 20 до 30 милисекунд. Но для проверки нахождения пикселя все равно придется использовать или 2 строки, проверяя @error, или добавлять проверку IsArray, или оборачивать в функцию, в которую засовывать 2 строки.
И побеждает третий вариант, так как IsArray времязатратный


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

Ошибся, IsArray нормально работает.
Код:
_CheckColor = 17.7001184145644
PixelSearch = 17.0740802101064
__CheckColor = 17.6688409398686 ;обертка PixelSearch  в функцию
IsArray = 15.8953103825089
В общем, спасибо. Но с первоначальной проблемой я так и не разобрался. Как будто что-то блокирует мышь. Так как любые события клавы воспроизводятся безупречно.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
А если дополнить MouseClick до полного перечисления всех опций?
Код:
MouseClick("LEFT", 500, 500, 1, 1)
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Я пробовал. Не помогло. Опять же, время от времени все начинает работать.
Да и ладно уже. Смирился. Скорее всего на компе что-то установлено и блокирует. Или я чего то напутал, или упускаю из вида.
 
A

Alofa

Гость
Попробуйте поиграться с:
Код:
Opt('MouseClickDownDelay', ... )
; или
Opt('MouseClickDelay', ... )
 
Верх