1

Тема: AHK: последовательность нажатия клавиш по координатам с проверкой

Суть такова не знаю как реализовать попробую объяснить со скрином в общем, есть панель где показана последовательность нажатии клавиш
тоесть стрелки (влево, вверх, вниз, вправо, клавиша к и j) нужно чтобы скрипт нажимал строго в последовательности указанной в скрине. Проблема в том что клавиши не подсвечены разным цветом, а они при нажатии только изменяют цвет как привязать нажатии не могу додуматься
еще соответственно между нажатиями нужна пауза хотябы в секунду. За рабочий скрипт кину 300р.
http://s1.ipicture.ru/uploads/20121116/6YJ4tI1k.jpg
http://s1.ipicture.ru/uploads/20121116/1UP7SMbu.jpg
нажатие клавиш всегда рандомное. то есть есть например 10 циклов и в них через разный интервал отображатся разные сочетания клавиш которые нужно нажимать по очередности.

http://s1.ipicture.ru/uploads/20121116/U41TUTp4.jpg
так выглядит уже нажатые клавиши кроме последней клавиши К

2

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

1. Сделать скриншот каждой из кнопок (6 шт.)
2. Использовать ImageSearch. Он как раз работает слева направо.

3 (изменено: Jimm24051983, 2012-11-17 13:13:25)

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Drugoy пишет:

1. Сделать скриншот каждой из кнопок (6 шт.)
2. Использовать ImageSearch. Он как раз работает слева направо.

скрин ка я показал уже сделал кнопки то как он будет читать ? пример скрипта напиши я сути не особо улавливаю
ImageSearch как должна работать? мне нужно вырезать каждую кнопку в фотошопе чтобы сделать кнопки?
pixelsearch понимаю как работает, а с ImageSearch еще не писал скрипта.

4 (изменено: Irbis, 2012-11-17 14:49:35)

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Вот скрипт, работающий с картинкой, взятой из поста №1
Он находит и нажимает 6 клавиш, изображения которых находятся на верхней панели. Координаты начала области для поиска (показано кружком) хранятся в переменных X0 и Y0, отсчитываются верхнего левого угла всего экрана.
Для поиска взяты участки изображения размером 8х8 пикселей, что более чем достаточно. Сохраненные фрагменты записаны в файлы Down.bmp, Up.bmp и т.д. для каждой клавиши.

#NoEnv
CoordMode, Pixel
SetWorkingDir , D:\img\buttons\ ; директория с изображениями кнопок
Step := 40
X0 := 340 ; X координата левого верхнего угла
Y0 := 330 ; Y координата левого верхнего угла
Pos := 0
KeysList := ["Left", "Right", "Down", "Up", "K", "J"]
loop {
   loop 6 {
      ImageSearch,,, X0+step*Pos, Y0, X0+step*(Pos+1), Y0+Step, % "*3 " KeysList[A_index] ".bmp"
	  if !ErrorLevel {
	    Send % "{" KeysList[A_index] "}"
		sleep 1000
      }
	}
   Pos := Pos < 6 ? Pos+1 : 0
   sleep 100  	
}

#F12:: ExitApp ; Win+F12 - выход

Фрагменты изображений:
http://zalil.ru/33970825

http://savepic.su/2925088m.png

Непонятно, почему клавиша J расположена на отдельной панели? Если есть еще одна панель, то для нее нужно добавить дополнительную проверку по имеющемуся образцу.
Если ImageSearch не будет находить нужных изображений, то возможны следующие причины:
- Координаты X0 и/или Y0 найдены неверно;
- сохраненные фрагменты изображений кнопок не соответствуют экранным. Это очень вероятно, так как в посте №1 изображение в формате JPG, и при его создании 100% точности с оригиналом не получится.
  Для совпадения нужно с оригинального снимка экрана вырезать фрагменты 8x8 и сохранять их в формате BMP

5

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Irbis пишет:

Непонятно, почему клавиша J расположена на отдельной панели? Если есть еще одна панель, то для нее нужно добавить дополнительную проверку по имеющемуся образцу.
Если ImageSearch не будет находить нужных изображений, то возможны следующие причины:
- Координаты X0 и/или Y0 найдены неверно;
- сохраненные фрагменты изображений кнопок не соответствуют экранным. Это очень вероятно, так как в посте №1 изображение в формате JPG, и при его создании 100% точности с оригиналом не получится.
  Для совпадения нужно с оригинального снимка экрана вырезать фрагменты 8x8 и сохранять их в формате BMP

нет панелька одна просто клавища J отдельно потому что ее не было в 1 цикле нажатии.  вопрос возникает
X0 := 340 ; X координата левого верхнего угла
Y0 := 330 ; Y координата левого верхнего угла

Вот эти координаты как вычислить поскольку панель достаточно быстро исчезает и нужно нажать все клавиши до исчезновения панели. при снимке с экрана както можно вычислить координаты панели или же непосредственно нужно делать в открытом окне в момент действия. Можно ли задать координаты поиска по изображению в диапазоне от верхнего левого угла до нижнего правого угла?
ImageSearch, Px, Py, 425, 744, 856, 746, KeysList[A_index], 0, Fast ;

6

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Вот эти координаты как вычислить

В момент появления панели сделать PrintScreen, вставить в любой графический редактор и посмотреть координаты. Абсолютная точность не требуется, плюс-минус несколько точек не влияют.

панель достаточно быстро исчезает и нужно нажать все клавиши до исчезновения панели.

Насколько быстро? Тогда зачем задержка в 1 секунду между нажатиями? Можно сделать и поменьше.

Можно ли задать координаты поиска по изображению в диапазоне от верхнего левого угла до нижнего правого угла?

Уменьшение области поиска сделано как раз для ускорения работы скрипта - он не ищет изображение там, где его заведомо нет.

7 (изменено: Jimm24051983, 2012-11-19 12:19:55)

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Скрипт работает заскринил по новой все кнопки как ты написал нужен bmp формат оригинала, напиши мне на почту куда тебе закинуть $. Еще как сделать так, чтобы проверка скрипта была,  если в определенном месте экрана появится еще картинка то закрыть это окно и идти к процессу запуска скрипта, процесс запуска скрипта должен примерно так выглядеть, если найден пиксель в определенном месте экрана то запустить процесс запуска скрипта то есть выполнить ряд движении и выделении мышкой чтобы опять вернутся к скрипту с проверкой  кнопок. Или написать так, если скрипт бездействует на протяжении минуты то запустить процесс запуска движения мышкой для запуска скрипта с проверкой на кнопки.

8

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Написал на почту, адрес netb?????@yandex.ru

Еще как сделать так, чтобы проверка скрипта была,  если в определенном месте экрана появится еще картинка то закрыть это окно и идти к процессу запуска скрипта то есть выполнить ряд движении и выделении мышкой

Правильно я понял - работают 2 скрипта, и один из них по некоторому условию запускает другой? Скорее всего, можно обойтись одним скриптом, если они предназначены для одной задачи.
Если проверка идет в фоне во время основной работы цикла, то можно организовать проверку по таймеру. Непонятно, зачем "выполнить ряд движении и выделении мышкой", если для запуска cуществуeт команда Run

; Начало скрипта
SetTimer, CheckWindow, 1000 ; проверка с интервалом 1сек
; ...
; Основной код
; ...

CheckWindow:
   ImageSearch,,, X0, Y0, X1, Y1, picture.bmp
   if !ErrorLevel
   {
      Click 900, 500 ; Кликнуть мышкой по кнопке закрытия окна - координаты подобрать свои
      Run, МойСкрипт.ahk
      }
Return

Если окно стандартное и Window Spy может определить его уникальные заголовок и класс, то процедура проверки будет примерно такой

; ...
CheckWindow:
   IfWinExist, ЗаголовокОкна ahk_class КлассОкна
   {
      WinClose
      Run, МойСкрипт.ahk
   }
Return

Или написать так, если скрипт бездействует на протяжении минуты то запустить процесс запуска движения мышкой для запуска скрипта с проверкой на кнопки.

Как понять "бездействие скрипта"? Определенные действия в нем все равно происходят, только если он не поставлен на паузу.
Также непонятно

процесс запуска скрипта должен примерно так выглядеть, если найден пиксель в определенном месте экрана то запустить процесс запуска скрипта

То есть появилось окно - закрыли, проверили некий пиксель - запустили скрипт. А если не найден пиксель, просто ждать его появления? Или опять ждать окна и нужный пиксель?
Напиши подробней.

9 (изменено: teadrinker, 2012-11-19 19:26:59)

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

В общем да, если появился пиксель на экране то надо закончить проверку клавиш в активном окне. И запустить скрипт запуска тоесть, этот скрипт это цикл в томже скрипте но там нужно по нескольким координатам двигать и кликать мышкой чтобы запустить процесс проверки клавиш. После того как цикл изображений клавиш заканчивается выскакивает окно которое нужно закрыть и опять вернутся к процессу проверки пикселя и запуска цикла движений и нажатии мышкой для запуска проверки. Начать цикл скрипта нужно тоже с проверки пикселя  потом проверку клавиша, если появится окно с изображением в другой части экрана то закрыть это окно и вернутся в начало скрипта.

10

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Jimm24051983, не нужно бессмысленно цитировать предыдущий пост целиком. Пользуйся кнопкой "Ответить".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11 (изменено: Irbis, 2012-11-19 19:59:05)

Re: AHK: последовательность нажатия клавиш по координатам с проверкой

Все-таки не совсем понятен твой поток мыслей, попробую угадать. В первоначальный скрипт внесены изменения, начало и конец новых блоков отмечены при помощи "============"
В первом блоке цикл loop{} ждет появление где-то пикселя, при его появлении нажимает  на ЛКМ несколько раз (координаты подбирать самому) и переходит к чтению с экрана и нажатию клавиш Up, Down и т.д.
Если не нужно бесконечное ожидание пикселя, а сразу переход к проверке при его отсутствии, то строки 13 и 23 ( "loop {" и "}" )  нужно убрать.
После каждого прохода по клавишам с их нажатием происходит проверка на появление окна (CheckWindow), для этого нужно вырезать часть окна, сохранить в picture.bmp и проверять его появление.
При нахождении оно закрывается и скрипт перезапускается с начала.
Если окна нет, происходит проверка пикселя (другого?), и щелчки ЛКМ по новым координатам.

#NoEnv
CoordMode, Pixel
CoordMode, Mouse
SetWorkingDir , D:\img\buttons\ ; директория с изображениями кнопок
Step := 40
X0 := 340 ; X координата левого верхнего угла
Y0 := 330 ; Y координата левого верхнего угла
Pos := 0
KeysList := ["Left", "Right", "Down", "Up", "K", "J"]
loop { ; основной внешний цикл

; ================================================================================
   loop {  ; ждем появления 1 пикселя, чтоб где-то покликать
      PixelGetColor, Color, 100, 200, RGB ; Поставить свои координаты Х и Y пикселя
      if (Color = 0xFFFFFF) ; найден нужный (белый) цвет - поставить свой
	  {
	     Click 0, 0 ; Клик по координатам на экране для запуска, подобрать из PrintScreen`a
		 click 0, 1 ; Другие координаты
		 ; Еще клики, по необходимости
		 break
	  }
	  sleep 1000
   }
; ================================================================================
   
   loop {
   loop 6 {
      ImageSearch,,, X0+step*Pos, Y0, X0+step*(Pos+1), Y0+Step, % "*3 " KeysList[A_index] ".bmp"
      if !ErrorLevel {
        Send % "{" KeysList[A_index] "}"
        sleep 1000
      }
    }
   Pos := Pos < 6 ? Pos+1 : 0
   sleep 100

; ================================================================================
; Проверяем появление 2 пикселя, после нажатий на клавиши
   Gosub CheckWindow ; проверка на появление окна
   PixelGetColor, Color, 100, 200, RGB ; Поставить свои координаты Х и Y пикселя
   if (Color = 0xFFFFFF) ; найден нужный (белый) цвет - поставить свой
   {
	  Click 0, 0 ; Клик по координатам на экране для запуска, подобрать из PrintScreen`a
	  click 0, 1 ; Другие координаты
	  ; Еще клики, по необходимости
	  break
   }
   }
; ================================================================================
}

; ================================================================================
CheckWindow:
   ImageSearch,,, X0, Y0, X1, Y1, picture.bmp
   if !ErrorLevel ; Окно найдено
   {
      Click 900, 500 ; Кликнуть мышкой по кнопке закрытия окна - координаты подобрать свои
	  Reload ; перезапуск скрипта
   }
Return
; ================================================================================

#F12:: ExitApp ; Win+F12 - выход