1 (изменено: bubaaa, 2012-09-10 18:51:50)

Тема: AHK: PixelSearch и нажатие клавиши.

Есть скрипт, в зависимости от цвета пикселя в окне он нажимает определенную клавишу. Цвета и координаты сам пропишу. Так же хотелось бы вставить клавишу типо Pause которую нажимаешь и он стартует скрипт, при следующем нажатии стопает скрипт.
Заранее спасибо за помошь.
В принципе скрипт и так работает, но хочется увидеть это в правильном написании, да бы было от чего отталкиваться далее.
ах да f = 1 это тупо переменная, потому что я не знаю что туда можно вписать что бы ничего не происходило.

while true
{
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 1
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 2
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 3
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 4
else
f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 5
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 6
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 7
else
    f=1
PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
if(errorlevel = 0)
    send 8
else
    f=1
}

2

Re: AHK: PixelSearch и нажатие клавиши.

bubaaa, ознакомься с этой темой, отредактируй заголовок.

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

3

Re: AHK: PixelSearch и нажатие клавиши.

Сорри отредактировал.

4 (изменено: Irbis, 2012-09-10 21:26:47)

Re: AHK: PixelSearch и нажатие клавиши.

bubaaa пишет:

ах да f = 1 это тупо переменная, потому что я не знаю что туда можно вписать что бы ничего не происходило.

Если else не нужен, его можно не писать.

p1 := [95, 287, 109, 291, 0xFFFFFF]
p2 := [95, 287, 109, 291, 0xFFFFFF]
p3 := [95, 287, 109, 291, 0xFFFFFF]
p4 := [95, 287, 109, 291, 0xFFFFFF]
p5 := [95, 287, 109, 291, 0xFFFFFF]
p6 := [95, 287, 109, 291, 0xFFFFFF]
p7 := [95, 287, 109, 291, 0xFFFFFF]
p8 := [95, 287, 109, 291, 0xFFFFFF]
pause
loop
   loop 8
   {
      PixelSearch, Px, Py, p%A_Index%[1], p%A_Index%[2], p%A_Index%[3] , p%A_Index%[4], p%A_Index%[5], 3, Fast
      if !errorlevel
         send % A_Index
   }
F12::pause

5

Re: AHK: PixelSearch и нажатие клавиши.

Спасибо за помощь, но у меня есть еще пара вопросов.
p%A_Index%[1] = как я понял это переменная с заданными коррдинатами - p1
p%A_Index%[2] = p2
почему их 5 когда координат 8? хотя скрипт работает нормально.
и еще вопрос он старутет пр нажатии F12 но не останавливается при его повторном нажатии... хотя ковырясь в настройках все написано правильно. =/

6

Re: AHK: PixelSearch и нажатие клавиши.

Нашел вот такую фразу

В AutoHotkey вообще сломан pause.
Если надо поставить скрипт на паузу, то лучше использовать suspend.
MButton:: Suspend  

LButton::
    Send {vk54}
    Click
    return

Правильно ли будет его использовать?

7

Re: AHK: PixelSearch и нажатие клавиши.

вообщем скрипт который выше выложили, не работает не выполняет ту задачу которая необходима. он просто спамит 12345678 и все

8

Re: AHK: PixelSearch и нажатие клавиши.

bubaaa, попробуйте вставить sleep внутрь цикла, тогда пауза будет работать.


...
loop
{
     loop 8
     {
      ...
      }
     sleep 100 ; например так
}

9

Re: AHK: PixelSearch и нажатие клавиши.

bubaaa пишет:

Спасибо за помощь, но у меня есть еще пара вопросов.
p%A_Index%[1] = как я понял это переменная с заданными коррдинатами - p1

p%A_Index%[1] - это первая координата (х0) левого верхнего угла прямоугольника, в котором идет поиск, p%A_Index%[2] - у0 и т.д., p%A_Index%[5] - искомый цвет. A_Index  меняется от 1 до 8, определяя номер точки. Если скрипт "спамит" 12345678, это значит что в указанной области поиска найден искомый цвет, как и было записано в исходном скрипте.

10 (изменено: bubaaa, 2012-09-11 12:47:03)

Re: AHK: PixelSearch и нажатие клавиши.

Irbis пишет:
bubaaa пишет:

Спасибо за помощь, но у меня есть еще пара вопросов.
p%A_Index%[1] = как я понял это переменная с заданными коррдинатами - p1

p%A_Index%[1] - это первая координата (х0) левого верхнего угла прямоугольника, в котором идет поиск, p%A_Index%[2] - у0 и т.д., p%A_Index%[5] - искомый цвет. A_Index  меняется от 1 до 8, определяя номер точки. Если скрипт "спамит" 12345678, это значит что в указанной области поиска найден искомый цвет, как и было записано в исходном скрипте.

Я наверно не правильно выразился. Скрипт не должен спамить 12345678. Он в зависимости от цвета должен спамить либо 1, либо 2 итд.
Пример

PixelSearch, Px, Py, 95, 287, 109, 291, 0xFFFFFF, 3, Fast
 if(errorlevel = 0)
    send 2
если цвет белый в квадрате по координатам 95, 287, 109, 291 он нажимал цифру 2

PixelSearch, Px, Py, 95, 287, 109, 291, 0x000000, 3, Fast - если цвет черный в квадрате по коррдинатам 95, 287, 109, 291 он нажимал цифру 3
 if(errorlevel = 0)
    send 3

если нету цветов из указанного диапазона он уходил в слип и делал проверку кадлые 100м/c

11

Re: AHK: PixelSearch и нажатие клавиши.

KepocuH пишет:

bubaaa, попробуйте вставить sleep внутрь цикла, тогда пауза будет работать.


...
loop
{
     loop 8
     {
      ...
      }
     sleep 100 ; например так
}

спасибо пауза корректно работает.

12 (изменено: Irbis, 2012-09-11 15:09:41)

Re: AHK: PixelSearch и нажатие клавиши.

bubaaa пишет:

Скрипт не должен спамить 12345678. Он в зависимости от цвета должен спамить либо 1, либо 2 итд.

Скрипт и не спамит 12345678. Он посылает последовательно 1, 2, и т.д., так как есть совпадение по цвету, указанному в последнем параметре переменных р1...р8. Измени для проверки цвет на несуществующий, например 0x10aa80 в р1 - и "1" не будет спамиться.

13 (изменено: bubaaa, 2012-09-11 16:50:39)

Re: AHK: PixelSearch и нажатие клавиши.

Irbis пишет:
bubaaa пишет:

Скрипт не должен спамить 12345678. Он в зависимости от цвета должен спамить либо 1, либо 2 итд.

Скрипт и не спамит 12345678. Он посылает последовательно 1, 2, и т.д., так как есть совпадение по цвету, указанному в последнем параметре переменных р1...р8. Измени для проверки цвет на несуществующий, например 0x10aa80 в р1 - и "1" не будет спамиться.

p1 := [400, 250, 410, 260, 0x000000]
p2 := [650, 300, 660, 310, 0x241CED]
p3 := [500, 500, 510, 510, 0x00F2FE]
p4 := [400, 250, 410, 260, 0xFFFFFF]
p5 := [400, 250, 410, 260, 0xFFFFFF]
p6 := [400, 250, 410, 260, 0xFFFFFF]
p7 := [400, 250, 410, 260, 0xFFFFFF]
p8 := [400, 250, 410, 260, 0xFFFFFF]
pause
loop
   loop 8
   {
      PixelSearch, Px, Py, p%A_Index%[1], p%A_Index%[2], p%A_Index%[3] , p%A_Index%[4], p%A_Index%[5], 3, Fast
      if !errorlevel
         send % A_Index
         sleep 100
   }
F12::pause

Меняю 3 первых цвета черный красный и желный, остальные выставяю белый цвет и устанавливаю координаты черного. все равно печатает 12345678. =/
проверено только что в вордпаде.

14

Re: AHK: PixelSearch и нажатие клавиши.

Только что проверил у себя, печатает 145678. Заменил черный цвет в p1 на 0x00000F, стало 45678, то есть скрипт работает. http://www.kolobok.us/smiles/standart/dntknw.gif
Какой версией ahk пользуетесь?

15

Re: AHK: PixelSearch и нажатие клавиши.

Version 1.0.48.05 может я не правильно как то координаты выставляю? для выставления координат пользуюсь встроенной Active windows info.

16

Re: AHK: PixelSearch и нажатие клавиши.

И да спасибо большое что ты все еще со мной мучаешься, все остальные уже плюнули =/

17 (изменено: Irbis, 2012-09-11 17:36:50)

Re: AHK: PixelSearch и нажатие клавиши.

Рекомендуется использовать AHK_L версию, которую разрабатывает Lexicos, так как офф.версия уже 2 года не обновляется.
Сайт http://l.autohotkey.net/

18

Re: AHK: PixelSearch и нажатие клавиши.

Irbis пишет:

Рекомендуется использовать AHK_L версию, которую разрабатывает Lexicos, так как офф.версия уже 2 года не обновляется.
Сайт http://l.autohotkey.net/

Заработало... спасибо большое...
Дальше я попробую сделать привязку к опеределенному окну и выложу сюда свои старания . если посмотришь буду благодарен безумно.

19

Re: AHK: PixelSearch и нажатие клавиши.

Мне часто приходится писать скрипты, которые работают с пикселями. Есть ли простой способ (хотя бы на время создания скрипта) как-то визуально отобразить что за точку я выбрал? Если точек много, то в них легко запутаться, а было бы удобно если бы их можно было и выбирать мышкой, например (т.е. растянул на экране спец прямоугольничек, а у тебя координаты всех 4-ёх его вершин сразу в текстовом виде вставляются куда-то (допустим, в буфер), а на экране они отображаются цветными квадратиками, скажем. И чтоб можно было их задавать относительными от окна или от какой-то точки в окне (часто, приходится что-то найти на экране [может находиться где угодно], а потом нужно проверить какие-то пиксели относительно той координаты). Есть ли что-то подобное? Может даже внешняя прога какая..?

20

Re: AHK: PixelSearch и нажатие клавиши.

Drugoy, посмотри этот пример из коллекции, возможно пригодится.

21

Re: AHK: PixelSearch и нажатие клавиши.

#IfWinActive, ---------
p1 := [400, 250, 410, 260, 0x000000]
p2 := [650, 300, 660, 310, 0x241CED]
p3 := [500, 500, 510, 510, 0x00F2FE]
p4 := [400, 250, 410, 260, 0xFFFFFF]
p5 := [400, 250, 410, 260, 0xFFFFFF]
p6 := [400, 250, 410, 260, 0xFFFFFF]
p7 := [400, 250, 410, 260, 0xFFFFFF]
p8 := [400, 250, 410, 260, 0xFFFFFF]
pause
loop
   loop 8
   {
      PixelSearch, Px, Py, p%A_Index%[1], p%A_Index%[2], p%A_Index%[3] , p%A_Index%[4], p%A_Index%[5], 3, Fast
      if !errorlevel
         send % A_Index
         sleep 100
   }
F12::pause

#IfWinNotActive ------------
  Winwait ---------

начало правильное, не запускть скрипт пока не открыто опеределенное окно.
Открываю окно нажимаю пузу все работает. Закрываю окно он продолжает работать, а нужно что бы стопался и и ждал открытия окна.
Что не правильно написал?

22

Re: AHK: PixelSearch и нажатие клавиши.

начало правильное, не запускть скрипт пока не открыто опеределенное окно.

Распространённое заблуждение, возникает если не читать справку.
#IfWinActive —

Creates context-sensitive hotkeys and hotstrings. Such hotkeys perform a different action (or none at all) depending on the type of window that is active or exists.

#IfWinActive

Создает контекстно-чувствительные горячие клавиши [hotkeys] и строки автозамены [hotstrings]. Такие горячие клавиши выполняют различные действия (или не делают ничего) в зависимости от окна, которое является активным или существует.

#IfWinActive не имеет отношения ни к чему кроме горячих клавиш.

23 (изменено: bubaaa, 2012-09-12 11:07:59)

Re: AHK: PixelSearch и нажатие клавиши.

creature.ws пишет:

начало правильное, не запускть скрипт пока не открыто опеределенное окно.

Распространённое заблуждение, возникает если не читать справку.
#IfWinActive —

Creates context-sensitive hotkeys and hotstrings. Such hotkeys perform a different action (or none at all) depending on the type of window that is active or exists.

#IfWinActive

Создает контекстно-чувствительные горячие клавиши [hotkeys] и строки автозамены [hotstrings]. Такие горячие клавиши выполняют различные действия (или не делают ничего) в зависимости от окна, которое является активным или существует.

#IfWinActive не имеет отношения ни к чему кроме горячих клавиш.

То есть получается что нет такой команды, которая прикрепляет выполнение скрипта к определенному окну?

а нет вроде нашел команду -IfWinExist / IfWinNotExist / WinExist , но в 1 описании на русском форуме оно стоит вместе с IfWinActive.
А на AHK L отдельно и чему верить?

24 (изменено: Irbis, 2012-09-12 17:03:59)

Re: AHK: PixelSearch и нажатие клавиши.

...
loop
{
   WinWaitActive, ИмяОкна
   loop 8
   {
...
   }
}

25

Re: AHK: PixelSearch и нажатие клавиши.

p1 := [120, 700, 130, 710, 0xFFFFFF]
p2 := [650, 300, 660, 310, 0x241CED]
p3 := [500, 500, 510, 510, 0x00F2FE]
p4 := [400, 250, 410, 260, 0xFFFFFF]
p5 := [400, 250, 410, 260, 0xFFFFFF]
p6 := [400, 250, 410, 260, 0xFFFFFF]
p7 := [400, 250, 410, 260, 0xFFFFFF]
p8 := [400, 250, 410, 260, 0xFFFFFF]
pause
loop
WinWaitActive, World of Wаrсrаft
   loop 8
   {
      PixelSearch, Px, Py, p%A_Index%[1], p%A_Index%[2], p%A_Index%[3] , p%A_Index%[4], p%A_Index%[5], 3, Fast
      if !errorlevel
         send % A_Index     
   }
F12::pause

Пробовал со скобками, пробывал без. пробывал c указанием ahk. Не работает пробывал не на вове, а на блакноте =/ не понимаю что нет так

26 (изменено: Irbis, 2012-09-12 17:15:34)

Re: AHK: PixelSearch и нажатие клавиши.

Моя вина, исправил пример с WinWaitActive из поста #24

Вот пример с Блокнотом в Win7:

p1 := [120, 700, 130, 710, 0xFFFFFF]
p2 := [650, 300, 660, 310, 0x241CED]
p3 := [500, 500, 510, 510, 0x00F2FE]
p4 := [400, 250, 410, 260, 0xFFFFFF]
p5 := [400, 250, 410, 260, 0xFFFFFF]
p6 := [400, 250, 410, 260, 0xFFFFFF]
p7 := [400, 250, 410, 260, 0xFFFFFF]
p8 := [400, 250, 410, 260, 0xFFFFFF]
pause
loop
{
   WinWaitActive, Безымянный — Блокнот
   loop 8
   {
      PixelSearch, Px, Py, p%A_Index%[1], p%A_Index%[2], p%A_Index%[3] , p%A_Index%[4], p%A_Index%[5], 3, Fast
      if !errorlevel
         send % A_Index     
   }
}
F12::pause

27 (изменено: creature.ws, 2012-10-04 09:50:18)

Re: AHK: PixelSearch и нажатие клавиши.

Drugoy пишет:

Мне часто приходится писать скрипты, которые работают с пикселями. Есть ли простой способ (хотя бы на время создания скрипта) как-то визуально отобразить что за точку я выбрал? […] (т.е. растянул на экране спец прямоугольничек, а у тебя координаты всех 4-ёх его вершин сразу в текстовом виде вставляются куда-то?

Ниже — «дружелюбный» аналог PixelSearch (раз уж речь зашла за прямоугольники).

Принцип использования:
В код включается нижеприведенный класс, в секции автозагрузки создаётся «экземпляр класса» с искомым кодом цвета, допустимой вариативностью и режимом поиска в качестве параметров.
Далее, при необходимости выбрать «регион поиска заданного цвета» необходимо вызвать метод ToggleRect(), при этом отобразится полупрозрачный прямоугольник, который можно перемещать зажав левую кнопку мыши и изменять его размер перемещением мыши с зажатой правой кнопкой. Поместив прямоугольник в «нужном месте» можно сразу начать поиск нужного цвета вызовом метода Search()
Данный метод возвращает единицу при нахождении нужного цвета, либо ноль в ином случае. Если пиксель найден — его координаты сохраняются в полях x и y данного экземпляра класса.

Горячие клавиши 1, 2, 3 в примере ниже позволяют отобразить-скрыть «прямоугольник», просмотреть содержимое полей объекта, произвести поиск.

«Дружелюбный к пользователю аналог» прочих команд работающих с пикселями и цветом напишите сами

Dark := new CSimplePixelSearch(0x404040, 10, "Fast RGB")

1::Dark.ToggleRect()
2::
    for i,k in Dark
        if IsObject(k)
            for j, v in k
                o .= "Dark." i "." . j . ": " . v . "`n"
        else o .= "Dark." . i . ": " . k . "`n"
    MsgBox % o "" o := ""
    return
3::MsgBox % Dark.Search()? ("x: " . Dark.x . " y: " Dark.y) : "Not Found"

class CSimplePixelSearch
{
    __New(color, variation, searchMode)
    {
        this.Rect := {w: 200, h: 100, transparent: 80, guiName: this.Random(20), guiColor: this.Random(6)}
        guiName := this.Rect.guiName

        Gui, %guiName%: -Resize +LastFound +AlwaysOnTop -Caption +ToolWindow +HWNDhWnd -E0x08000000
        Gui, %guiName%: Color, % this.Rect.guiColor
        WinSet, Transparent, % this.Rect.transparent

        this.Rect.hwnd := hWnd
        this.color := color
        this.searchMode := searchMode
        this.variation := variation
    }

    ToggleRect()
    {
        guiName := this.Rect.guiName

        if WinExist("ahk_id" this.Rect.hWnd)
            this.SaveRectPos()
        else {
            coord .=  (x := this.Rect.x)? "x" . x . " " : ""
            coord .=  (y := this.Rect.y)? "y" . y . " " : ""
            coord .=  (w := this.Rect.w)? "w" . w . " " : ""
            coord .=  (h := this.Rect.h)? "h" . h . " " : ""
            Gui, %guiName%: Show, % coord . "NA"

            this.EnableRectControl(true)
        }
    }

    EnableRectControl(switch = true)
    {
        static WM_RBUTTONDOWN := 0x204, WM_LBUTTONDOWN := 0x201

        if (switch) {
            OnMessage(WM_LBUTTONDOWN, this.__class . ".WindowProc")
            OnMessage(WM_RBUTTONDOWN, this.__class . ".WindowProc")
        }
        else {
            OnMessage(WM_LBUTTONDOWN, "")
            OnMessage(WM_RBUTTONDOWN, "")
        }
    }

    SaveRectPos()
    {
        WinGetPos, x, y, w, h, % "ahk_id" this.Rect.hWnd
        if (x) {
            this.x1 := x
            this.y1 := y
            this.x2 := x + w
            this.y2 := y + h
            this.Rect.x := x
            this.Rect.y := y
            this.Rect.w := w
            this.Rect.h := h
            guiName := this.Rect.guiName
            Gui, %guiName%: Cancel
        }
    }

    Search()
    {
        WinExist("ahk_id" this.Rect.hWnd) && this.SaveRectPos()

        CoordMode, Pixel
        PixelSearch, x, y, this.x1, this.y1, this.x2, this.y2, this.color, this.variation, % this.searchMode
        this.found := !ErrorLevel
        return !ErrorLevel, this.x := x, this.y := y
    }

    Random(nLenght)
    {
        static baseCharSet := "1|2|3|4|5|6|7|8|9|0|A|B|C|D|E|F"

        charSet := baseCharSet
        loop % nLenght//17
            charSet .= baseCharSet

        Sort, charSet, D| Random
        StringReplace, charSet, charSet, |,,1

        return SubStr(charSet, 1, nLenght)
    }

    WindowProc(lParam, uMsg, hWnd)
    {
        static WM_RBUTTONDOWN := 0x204, WM_LBUTTONDOWN := 0x201, WM_NCLBUTTONDOWN := 0xA1, HTCAPTION := 2

        if (uMsg = WM_LBUTTONDOWN)
            PostMessage, WM_NCLBUTTONDOWN, HTCAPTION ,,, % "ahk_id"hWnd
        else if (uMsg = WM_RBUTTONDOWN) {
            CoordMode, Mouse
            SetWinDelay, 0
            WinExist("ahk_id" hWnd)

            while GetKeyState("RButton", "P")
            {
                MouseGetPos, x, y
                if (x <> priorX || y <> priorY) {
                    WinGetPos,,, w, h
                    WinMove,,,,, w + (x - priorX), h + (y - priorY)
                    priorX := x, priorY := y
                }
                Sleep 10
            }
        }
        return true
    }
}

28

Re: AHK: PixelSearch и нажатие клавиши.

И еще вопросик, хочу вписать еще 1 момент.
При нажатии клавишь e и q чтобы скрипт стопался на 500 милисекунад.

vk45::
sleep 500
send vk45::

нашел вот это, но при нажатии E он, отсылает не букву E, а vk45::. в блакноте. Подскажите в чем ошибка, и в кукую часть вставить это скрипт?.

29 (изменено: Irbis, 2012-09-13 15:27:03)

Re: AHK: PixelSearch и нажатие клавиши.

Уважаемые форумчане bubaaa и Drugoy!
На форуме есть правило: Один вопрос - одна тема. Ваши последние вопросы в теме "PixelSearch & нажатие клавиши" коррелируют с ней чуть более, чем никак. Не стесняейтесь создать новую тему, если есть вопрос. (Хотя сначала крайне желательно ознакомиться со справкой и почитать форум).
bubaaa, по поводу горячих клавиш темы создаются несколько раз за неделю, а в Коллекции даже есть отдельный раздел для новичков .

$vk45::
   sleep 500
   send {vk45}
return