1

Тема: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Данный скрипт посылает нажатия клавиши, когда загорается нужный пиксель. Сам скрипт работает, но проблема в том, что когда добавляешь новый пиксель и привязываешь к нему клавишу, он начинает медленнее посылать  нажатия (спамить клавишу). Как можно оптимизировать/решить проблему?

loop	

{	
		PixelGetColor, Color, 30, 1040 
		if (Color = 0x0086FF) 
		{
		SendInput {G}
		Sleep 1
		}

		else

	    PixelGetColor, Color, 25, 1040 
	    if (Color = 0x00b3ff)
		{ 
		SendInput {V} 
		} 

		else

	    PixelGetColor, Color, 17, 1040
	    if (Color = 0xe100ff)
		{ 
		SendInput {1}
		Sleep 10
		} 	 

		else

	    PixelGetColor, Color, 17, 1040
	    if (Color = 0x0011ff)
		{ 
		SendInput {3} 
		Sleep 10
		} 

		else

		PixelGetColor, Color, 16, 1040 
		if (Color = 0x0004FF) 
		{
		SendInput {8}
		Sleep 10
		}

		else

	    PixelGetColor, Color, 17, 1040
	    if (Color = 0x00aeff)
		{ 
		SendInput {4}
		Sleep 10
		} 

		else

	    PixelGetColor, Color, 17, 1040
	    if (Color = 0xff3a00)
		{ 
		SendInput {2}
		Sleep 10
		}		

		else	

		PixelGetColor, Color, 17, 1040
		if (Color = 0x00ff02)
		{ 
		SendInput {3} 
		Sleep 10
		}   

		else

	    PixelGetColor, Color, 22, 1040
	    if (Color = 0xff4100)
		{ 
		SendInput {7} 
		Sleep 200
		}	

		else	

		PixelGetColor, Color, 16, 1040
		if (Color = 0x00FF9C) 
		{
		SendInput {F6} 
		Sleep 4000
		}

		else

		PixelGetColor, Color, 16, 1040
		if (Color = 0x51FF00) 
		{
		SendInput {F7} 
		Sleep 4000
		}
}
return

2

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Не уверен, что алгоритм верно представлен в коде. Если после else нет фигурных скобок, то к этой команде относится только первая строчка, всё остальное выполнится в любом случае.

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

3

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Попробовал сделать вот так, но проблема все равно сохранилась.

loop
{
      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0xe100ff)
      {
        SendInput {1}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x0011ff)
      {
        SendInput {3}
      }
       break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x00ff02)
      {
        SendInput {3}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x00aeff)
      {
        SendInput {4}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x0004FF)
      {
        SendInput {8}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0xff3a00)
      {
        SendInput {2}
      }
      break
    }
     loop {
        PixelGetColor, Color, %get_x2%, %get_y%
      if (Color = 0x0004FF)
      {
        SendInput {g}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x3%, %get_y%
      if (Color = 0x00b3ff)
      {
        SendInput {v}
      }
      break
    }   
     loop {
        PixelGetColor, Color, %get_x4%, %get_y%
      if (Color = 0xff4100)
      {
        SendInput {7}
      }
      break
    }

      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x00FF9C)
      {
        SendInput {F6}
      }
      break
    }   
     loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0x51FF00)
      {
        SendInput {F7}
      }
      break
    }       
}
return

4

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

imsialroma пишет:
      loop {
        PixelGetColor, Color, %get_x%, %get_y%
      if (Color = 0xe100ff)
      {
        SendInput {1}
      }
      break
    }

Здесь в Loop нет никакого смысла, поскольку break выполнится в любом случае в первой же итерации. То-есть, скорее всего, сами плохо представляете, каким должен быть алгоритм. Попытайтесь на словах описать.

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

5

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Есть несколько триггеров разного цвета, находящиеся в одной точке (X,Y). Как только загорается нужный пиксел(триггер) в данной точке, должно посылаться эмуляция нажатия клавиши в активное окно. У меня 11 триггеров, соответственно 11 биндов. Если делать без loop или else, то скрипт либо зацикливает нажатие одной клавиши, либо посылает одно нажатие и закрывается или же вовсе не запускается.

6

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Если всё, как вы описали, то так:

obj := [ {clr: 0xe100ff, key: "1"}
       , {clr: 0x0011ff, key: "3"}
       , {clr: 0x00ff02, key: "3"}
       , {clr: 0x00aeff, key: "4"}
       , {clr: 0x0004FF, key: "8"}
       , {clr: 0xff3a00, key: "2"}
       , {clr: 0x0004FF, key: "g"}
       , {clr: 0x00b3ff, key: "v"}
       , {clr: 0xff4100, key: "7"}
       , {clr: 0x00FF9C, key: "F6"}
       , {clr: 0x51FF00, key: "F7"} ]

Loop {
   for k, v in obj {
      PixelGetColor, Color, get_x, get_y
      if (Color = v.clr)
         Send, % "{" . v.key . "}"
   }
   Sleep, 10
}

Но в начале ещё должно быть установлено CoordMode (чтобы задать, относительно чего координаты), а также, возможно, опция RGB в PixelGetColor (если цвета в RGB).

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

7

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

teadrinker Спасибо, за решение, код стал более оптимизирован. Но, к сожалению, проблему это не решило. Такое ощущение что Sleep, 10 = Sleep, 100

8

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Такого не может быть, проблема в чём-то другом. Сколько занимает времени весь цикл, можно так проверить:

Loop {
   start := A_TickCount
   for k, v in obj {
      PixelGetColor, Color, get_x, get_y
      if (Color = v.clr)
         Send, % "{" . v.key . "}"
   }
   Sleep, 10
   ToolTip % A_TickCount - start
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

teadrinker 189-250 мс

10

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Наверно, это нормально для 11 точек, у меня так же без нахождения цветов и посыла клавиш.

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

11

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

teadrinker Для 2ух цветов 30-60 мс и там сразу видно что Sleep, 10

12

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Sleep в любом случае столько, сколько написано, но не менее 10-15 мс.

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

13 (изменено: imsialroma, 2019-12-10 20:16:09)

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Акутально. С каждым добавленным новым цветом, увеличивается задержка (стоит Sleep 10).

14

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

А в чём вопрос-то? Так и должно быть. На получение цвета требуется время.

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

15

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Может получение цвета вынести перед for?

Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

16

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Phoenixxx_Czar, похоже вы правы, я что-то ступил слегка.

obj := [ {clr: 0xe100ff, key: "1"}
       , {clr: 0x0011ff, key: "3"}
       , {clr: 0x00ff02, key: "3"}
       , {clr: 0x00aeff, key: "4"}
       , {clr: 0x0004FF, key: "8"}
       , {clr: 0xff3a00, key: "2"}
       , {clr: 0x0004FF, key: "g"}
       , {clr: 0x00b3ff, key: "v"}
       , {clr: 0xff4100, key: "7"}
       , {clr: 0x00FF9C, key: "F6"}
       , {clr: 0x51FF00, key: "F7"} ]

Loop {
   PixelGetColor, Color, get_x, get_y
   for k, v in obj {
      if (Color = v.clr) {
         Send, % "{" . v.key . "}"
         break
      }
   }
   Sleep, 10
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

teadrinker, Phoenixxx_Czar, спасибо вам большое за решение!

18

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

Возник еще небольшой вопрос.

obj := [ {get_x: 17, get_y: 1040, clr: 0xe100ff, key: "1"}
       , {get_x: 25, get_y: 1040, clr: 0x0011ff, key: "3"} 
       , {get_x: 33, get_y: 1040, clr: 0x00ff02, key: "3"} ] 

Я сделал из get_x и get_y переменные и записывал в Loop

PixelGetColor, Color, v.get_x, v.get_y

.
Но сейчас они находятся перед for и так уже не работает, как это можно исправить?

19

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

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

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

20

Re: AHK: Медленно посылает нажатия клавиши (Loop, PixelGetColor).

imsialroma, команда PixelGetColor состоит из двух операций: взятия снимка экрана (времязатратная) и взятия значения пикселя из снимка. Вам нужно разнести эти операции, взять снимок один раз перед циклом, а внутри брать разные пиксели.
Подробнее тут.