1 (изменено: yellow, 2022-05-20 17:28:08)

Тема: AHK: Клик со смещением

Ненашёл по поисковику подобное решение, или очень замороченные функции,
Должно же быть в ахк простое решение для смещения и клика по заданным координатам?
Там в целом надо найти точку одного цвета и ткнуть чуть ниже её

+ открыть спойлер
PixelSearch, Px, Py, 105, 484, 1174, 494, 0x34FF97, 3, Fast
Sleep, 300
if ErrorLevel
{
Click Px, Py-10, 1
}

короче вот в этом вот приложении http://playpack.ru/game/igra_simulyato … aturi.html надо чтобы в полноэкранной развёрстке в пресетах Songs, находило зелёный сигнал над клавишей и её тыкало, но что-то ни цвет не находит, и тыкает в текущую координату.

+ открыть спойлер
PixelSearch, Px, Py, 105, 484, 1174, 494, 0x97FF34, 3, Fast ;0x34FF97
if ErrorLevel 
Sleep, 300
{
ToolTip, Найдено 
MsgBox, Найдено в at X%Px% Y%Py%. ;Но здесь координаты не пишутся в сообщении. они похоже равны 0 несмотря на то, что PixelSearch что-то там находит.
;MouseMove, Px, Py,
;Click Px, Py, 0
MouseMove, Px, Py, 0,
ToolTip, Перемещаю в найденное
sleep 600
MouseMove, 0, 5, 50, R
ToolTip, Смещаю
sleep 500
ToolTip, тыкаю
Click
}

Тут какие-то моды для координат курсора и мыши, в которых совсем непросто разобраться, и несколько видов и непонятно какой из них конкретно для этой задачи предназначен

CoordMode,Mouse,Screen
CoordMode,Pixel,Screen

2 (изменено: yellow, 2022-05-20 20:53:18)

Re: AHK: Клик со смещением

Если долго смотреть на задающего вопрос, можно увидеть как он отвечает на него сам.

+ открыть спойлер
While 1==1 {
sleep 10
toggle := GetKeyState("Capslock", "T")
sleep 10
if (toggle = 0)
continue
else
{
Sleep, 100
CoordMode, Pixel, Client
C := 0x34FF97  ;Искомый цвет 
sleep 10
PixelSearch, Px, Py, 105, 484, 1174, 494, C, 3, Fast 
sleep 10
if ErrorLevel 
{
ToolTip, Требуемый цвет в заданных границах не найден.
;MsgBox, не найден %ErrorLevel%
}
else 
{
;MsgBox, найден %ErrorLevel%
ToolTip, Координаты %Px% %Py%
Sleep, 3
ToolTip, Найдено 
MouseMove, Px, Py, 0,
ToolTip, Перемещаю в найденное
sleep 1
MouseMove, 0, 50, 0, R
ToolTip, Смещаю
sleep 1
ToolTip, тыкаю
Click
Sleep, 10
}
}
}
return

Иногда проскальзывали двойные клики
Правда, значения Error level непонятны, они то 1, то 2, то 0, сдаётся мне и до конца непонятна суть этой фразы, им как-то по-другому надо пользоваться.

3 (изменено: __Михаил__, 2022-05-20 21:34:03)

Re: AHK: Клик со смещением

'While 1==1' зачем так сложно? Просто 'Loop' например сделать.
Что мешает зайти в справку и прочитать про 'ErrorLevel'?

ErrorLevel устанавливается в 0, если цвет был найден в указанной области, 1, если он не был найден, или 2, если возникла проблема, которая помешала команде провести поиск.

Отступы добавляйте, иначе код плохочитаемый выходит.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Клик со смещением

__Михаил__ пишет:

Просто 'Loop' например сделать.

Нет с лупом почему-то 2 раза выполняется, там и в справке помоему даже написано что он должен минимум 1 раз выполнится после return поэтому он не подходит. Есть свои нюансы.

__Михаил__ пишет:

или 2, если возникла проблема, которая помешала команде провести поиск.

Вот в том и проблема что непонятно что за проблема у него может возникнуть, ErrorLevel же не расшифровывает свои проблемы, а в том что может быть значение отличное от 1 или 0- это дополнительная ветвь в алгоритме, которую никто почему-то в распространённых примерах не указывает. Если её не добавить в скрипте выходит ошибка по тем или иным причинам, а ты сидишь и думаешь - почему это?
Отступы автоматом не добавляются, незнаю как это сделать. Если я каждую строчку выравнивать буду - я умру от нервного истощения быстрее чем вы сможете прочитать без отступов.

5 (изменено: isxodnik, 2022-05-23 23:21:58)

Re: AHK: Клик со смещением

yellow пишет:
PixelSearch, Px, Py, 105, 484, 1174, 494, 0x97FF34, 3, Fast ;0x34FF97
if ErrorLevel 
	MsgBox, Найдено в at X%Px% Y%Py%. ;Но здесь координаты не пишутся в сообщении. они похоже равны 0 несмотря на то, что PixelSearch что-то там находит.

В таком виде MsgBox появится, если PixelSearch НЕ найдёт пиксель нужного цвета. Вот рабочий вариант:


PixelSearch, Px, Py, 105, 484, 1174, 494, 0x97FF34, 3, Fast
if (ErrorLevel = 0)
	MsgBox, Найдено в at X %Px% Y %Py%.

Возможно, это не единственная ваша ошибка, но больше не искал. Повтыкал в синтезатор по ссылке, так и не понял, как добиться зелёного сигнала.

Может,


CoordMode, Pixel, Client	;по идее не нужно?

C := 0x34FF97

Loop
	{
	Sleep, 100
	
	toggle := GetKeyState("Capslock", "T")
	if (toggle = 0)	;если капс не нажат
		continue	;может, проще остановить скрипт, чтоб не молотил зря?
	
	PixelSearch, Px, Py, 105, 484, 1174, 494, C, 3, Fast 
	if (ErrorLevel = 0)
		{
		MouseMove, Px, Py + 50, 0
		ToolTip, тыкаю	;отладочное сообщение, убрать?
		Click
		Sleep, 	; ? возможно, сигналу нужно какое-то время, чтобы погаснуть, больше, чем 100 мс в начале цикла?
		}
	else
		ToolTip, Требуемый цвет в заданных границах не найден.
	}

6 (изменено: yellow, 2022-05-24 19:28:56)

Re: AHK: Клик со смещением

isxodnik пишет:

не единственная ваша ошибка, но больше не искал

Т.е. Error Level по умолчанию равен 0, если не написано ничего.

isxodnik пишет:

может, проще остановить скрипт, чтоб не молотил зря?

А как он будет искать следующий сигнал?

Отладочные сообщения тоже убираются обычно, но для начала нужно добиться стабильной работы.

isxodnik пишет:

Повтыкал в синтезатор по ссылке, так и не понял, как добиться зелёного сигнала.

Да там надо заготовки композиций выбрать по кнопке "Songs"

7

Re: AHK: Клик со смещением

yellow пишет:

Т.е. ErrorLevel по умолчанию равен 0

Да, и поскольку запись

if ErrorLevel

скрипт читает как "если ErrorLevel = true", а true это натуральное число, а 0 это false, то эта запись сработает только в случае ошибки PixelSearch. Если нужно повесить действие на успешную проверку "цвет найден", то надо или


if (ErrorLevel = 0)
;или
if !ErrorLevel
yellow пишет:

А как он будет искать следующий сигнал?

Запись


toggle := GetKeyState("Capslock", "T")
if (toggle = 0)
	continue

говорит: "если капс включен, то выполняем цикл (и ищем цвет); если выключен, то возвращаем скрипт с этого места в начало петли, и до поиска пикселя он не доходит". Я и думаю, что как-то естественнее просто выключить скрипт, когда он не нужен, чем заставлять его постоянно выполнять "проверка условия - возврат в начало цикла, проверка условия - возврат в начало цикла, проверка условия - возврат в начало цикла, проверка условия - возврат..."