1 (изменено: HideGenius, 2015-01-23 23:36:58)

Тема: AHK: Движение мышки стрелками и остановка перед белым цветом

Помогите сделать скрипт в котором стрелки управляют курсором то есть:
Нажимайте стрелку вправо курсор движется вправо пока не наткнётся на белый цвет пикселя и останавливает курсор перед белым цветом. Можете привести пример. Возможно такое?

2

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Ну помогите.

3

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

PixelGetColor
MouseMove

0xFFFFFF
0xFF0000
0xFFFFFF

4

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

http://forum.script-coding.com/viewtopic.php?id=3630

Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Спасибо, видел но как соединить с функцией остановка перед белым цветом незнаю.

6

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

stealzy пишет:

PixelGetColor
MouseMove

Спасибо, Help File читал но там нет даже подобного примера.

7

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

N = 5    ; коэффициент ускорения, можно менять 0-20
s = 3    ; коэффициент скорости, можно менять 1-20

vk65:: ; numpad 5 имитирует перемещение мыши вниз
vk64:: ; numpad 4 имитирует перемещение мыши влево
vk66:: ; numpad 6 имитирует перемещение мыши вправо
vk68:: ; numpad 8 имитирует перемещение мыши вверх
    While GetKeyState(A_ThisHotkey, "P") || GetKeyState(A_PriorHotkey, "P")
    {
    k := a_index*s*N/40
    shift := N = 0 ? s : k

        if GetKeyState("vk65", "P")
        {
            if GetKeyState("vk64", "P")
                x := -shift, y := shift
            Else if GetKeyState("vk66", "P")
                x := y := shift
            Else
                x := 0, y := shift
        }
        Else if GetKeyState("vk64", "P")
        {
            if GetKeyState("vk65", "P")
                x := -shift, y := shift
            Else if GetKeyState("vk68", "P")
                x := y := -shift
            Else
                x := -shift, y := 0
        }
        Else if GetKeyState("vk66", "P")
        {
            if GetKeyState("vk68", "P")
                x := shift, y := -shift
            Else if GetKeyState("vk62", "P")
                x := y := shift
            Else
                x := shift, y := 0
        }
        Else if GetKeyState("vk68", "P")
        {
            if GetKeyState("vk66", "P")
                x := shift, y := -shift
            Else if GetKeyState("vk64", "P")
                x := y := -shift
            Else
                x := 0, y := -shift
        }
        MouseMove, x, y, 0, R
;        Sleep, 20
mousegetpos,mx,my
PixelGetColor,color,mx,my
if color=0xffffff
{
  MouseMove, x*-1,y*-1, 0, R
  tooltip,% color
}
    }
    Return
Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Alectric,  функция GetKeyState() возвращает 0 или 1, зачем эти каскады условных операторов, когда можно использовать напрямую?
К чему двигать курсор туда-сюда при попадании на белый цвет, если можно узнать цвет точки, куда мы собираемся его передвинуть? Если он - белый, просто ничего не делаем.

N = 5    ; коэффициент ускорения, можно менять 0-20
s = 3    ; коэффициент скорости, можно менять 1-20

vk65:: ; numpad 5 имитирует перемещение мыши вниз
vk64:: ; numpad 4 имитирует перемещение мыши влево
vk66:: ; numpad 6 имитирует перемещение мыши вправо
vk68:: ; numpad 8 имитирует перемещение мыши вверх
While GetKeyState(A_ThisHotkey, "P") || GetKeyState(A_PriorHotkey, "P") {
   k := a_index*s*N/40
   shift := N = 0 ? s : k
   x := shift*(GetKeyState("vk66", "P")-GetKeyState("vk64", "P")), y := shift*(GetKeyState("vk65", "P")-GetKeyState("vk68", "P"))
   mousegetpos,mx,my
   PixelGetColor,color,mx+x,my+y
   if (color<>0xffffff) {
      MouseMove, x,y, 0, R
      tooltip,% color
   }
}
Return

9

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Я лиш взял код из ссылки и подправил (тот код 2009 года). Не стал продумывать все.

Лентяй я.

Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10 (изменено: HideGenius, 2015-01-25 18:13:50)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Alectric пишет:

Я лиш взял код из ссылки и подправил (тот код 2009 года). Не стал продумывать все.

Лентяй я.

Ваш скрипт больше работает если поставить скорость и ускорение на 20 то в вашем скрипте курсор не улетает за границы белого, а Irbis-а код просто летает и не останавливаеться. Код я хотел для вырезания картинок но в программе Snagit код не работает. Спасибо всем.

11

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Зачем результат выражения в переменной, если оно возможно не пригодится?

   k := a_index*s*N/40
   shift := N = 0 ? s : k

может?

shift := N = 0 ? s : a_index*s*N/40
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v20H2, AutoHotkey_L v1.1.33.09 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

12

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Подумал: "А зачем жесткая привязка к клавишам?", и вот что получилось.
В данном примере список Dir прописан в скрипте, можно переделать для чтения из INI-файла или определения клавиши в пользовательском GUI,  в зависимости от фантазии и потребностей. Хоть из имени файла - переименовал "wasd.ahk" в "8456.ahk", хоткеи при новом старте будут другие.
Переменная F введена только для сокращения кода.

+ открыть спойлер

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

N = 5    ; коэффициент ускорения, можно менять 0-20
s = 3    ; коэффициент скорости, можно менять 1-20
F:= "GetKeyState", Dir:= {R: "vk66", L:"vk64", U:"vk68", D:"vk65"}
for k in Dir
   HotKey, % Dir[k], HK
Return
HK:
While %F%(A_ThisHotkey) || %F%(A_PriorHotkey) {
   shift := N = 0 ? s : a_index*s*N/40
   x := shift*(%F%(Dir["R"])-%F%(Dir["L"])), y := shift*(%F%(Dir["D"])-%F%(Dir["U"]))
   mousegetpos,mx,my
   PixelGetColor,color,mx+x,my+y
   if (color<>0xffffff) {
      MouseMove, x,y, 0, R
      tooltip,% color
   }
}
Return

13

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Irbis пишет:
+ открыть спойлер

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

Оценил.

N = 5    ; коэффициент ускорения, можно менять 0-20
s = 3    ; коэффициент скорости, можно менять 1-20
F:= "GetKeyState", Dir:= {R: "vk66", L:"vk64", U:"vk68", D:"vk65"}
for k in Dir
   HotKey, % Dir[k], HK
Return
HK:
While %F%(A_ThisHotkey) || %F%(A_PriorHotkey) {
   shift := N = 0 ? s : a_index*s*N/40
   x := shift*(%F%(Dir["R"])-%F%(Dir["L"])), y := shift*(%F%(Dir["D"])-%F%(Dir["U"]))
   mousegetpos,mx,my
   PixelGetColor,color,mx+x,my+y
   if (color<>0xffffff) {
      MouseMove, x,y, 0, R
      tooltip,% color
   }
}
Return

Спасибо, но проблема та же. У Snagit при вырезании появляеться вместо курсора круг в центре  цель и скрипт "видит" только цвет пикселя Snagit, а не цвет под курсором.

14 (изменено: Irbis, 2015-01-26 16:08:55)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Значит, надо изменить сам способ получения границ картинки. Не двигать курсор, а сначала найти координаты прямоугольника, ограниченного белым цветом, затем произвести выделение.
Например, так можно при нажатии хоткея получить координаты левого верхнего и правого нижнего угла картинки в массив Rect, затем выделить регион при помощи ЛКМ. Ввиду ограничения PixelSearch на поиск влево и вверх от текущей позиции, режим fast в этих направлениях не работает, поэтому курсор лучше подвести ближе к левому верхнему краю картинки.

Rect:= [0,0,0,0]
F11:: ; Заменить на используемый в Snagit хоткей, не забыв про "~"
   if FindBorder(Rect) ; границы найдены
      MouseClickDrag, Left, Rect[1], Rect[2],Rect[3],Rect[4], 10 ; 0 - мнгновенное выделение
   else
      MsgBox Границы не найдены.
Return

FindBorder(Rect, c := 0xffffff) ; по умолчанию белый цвет
{
   MouseGetPos, x, y
   PixelSearch, x0,, x, y, 0, y, c
   PixelSearch, x1,, x, y, A_ScreenWidth, y, c,, fast
   PixelSearch,,y0, x, y, x, 0, c
   PixelSearch,,y1, x, y, x, A_ScreenHeight, c,, fast
   if  x0&&x1&&y0&&y1 {
      Rect[1] := x0, Rect[2] := y0, Rect[3] := x1, Rect[4] := y1
      Return 1
   }
}

15 (изменено: Alectric, 2015-01-26 17:51:24)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Alt+Левая кнопка в центр картинки:

color=0xffffff

!lbutton::
keywait,lbutton,t
MouseGetPos,x,y

x1:=find(x,y,"x",-1,color)
y1:=find(x,y,"y",-1,color)

x2:=find(x,y,"x",1,color)
y2:=find(x,y,"y",1,color)

MouseClickDrag,Left,x1+1,y1+1,x2-1,y2-1,10
return


find(x=0,y=0,o="x",d=1,c=0)
{
  if o=x
  {
    while color!=c
    {
      xx:= d>0 ? x+a_index : x-a_index
      PixelGetColor,color,xx,y
      tooltip,%xx% %y%,xx+5,y+5
    }
    tooltip
    return xx
  }
  else if o=y
  {
    while color!=c
    {
      yy:= d>0 ? y+a_index : y-a_index
      PixelGetColor,color,x,yy
      tooltip,%x% %yy%,x+5,yy+5
    }
    tooltip
    return yy
  }
}

Но работает очень медленно в любом варианте...

Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

16

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Думаю, PixelSearch примерно так и работает в режиме Slow.
Для ускорения в данном случае можно "шагать" не по-пиксельно, а с шагом (например 20 пикселей), уповая на то, что белая рамка вокруг картинки имеет некую толщину, превышающую 1 пиксель. Затем произвести более точную подгонку.

17 (изменено: Alectric, 2015-01-26 18:27:26)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Вариант с временным отключением композиции рабочего стола:


color=0xffffff

!lbutton::
keywait,lbutton,t
MouseGetPos,x,y
DllCall("Dwmapi\DwmEnableComposition", "UInt", 0)
x1:=find(x,y,"x",-1,color)
y1:=find(x,y,"y",-1,color)
x2:=find(x,y,"x",1,color)
y2:=find(x,y,"y",1,color)
DllCall("Dwmapi\DwmEnableComposition", "UInt", 1)
sleep,1000
MouseClickDrag,Left,x1+1,y1+1,x2-1,y2-1,10
return

find(x=0,y=0,o="x",d=1,c=0)
{
  if o=x
  {
    while color!=c
    {
      xx:= d>0 ? x+a_index : x-a_index
      if (xx<0 or xx>a_screenwidth)
        break
      PixelGetColor,color,xx,y
      tooltip,%xx% %y%,xx+5,y+5
    }
    tooltip
    return xx
  }
  else if o=y
  {
    while color!=c
    {
      yy:= d>0 ? y+a_index : y-a_index
      if (yy<0 or yy>a_screenheight)
        break
      PixelGetColor,color,x,yy
      tooltip,%x% %yy%,x+5,yy+5
    }
    tooltip
    return yy
  }
}

Win 7 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

18

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

На win8 никакой разницы. А вот с "подгонкой" скорость вырастает, особенно если s увеличить.

color:=0xffffff, s := 15

!lbutton::
keywait,lbutton,t
MouseGetPos,x,y
DllCall("Dwmapi\DwmEnableComposition", "UInt", 0)
x1:=find(find(x,y,"x",-s,color)+s,y,"x",-1,color)
y1:=find(x,find(x,y,"y",-s,color)+s,"y",-1,color)
x2:=find(find(x,y,"x",s,color)-s,y,"x",1,color)
y2:=find(x,find(x,y,"y",s,color)-s,"y",1,color)
DllCall("Dwmapi\DwmEnableComposition", "UInt", 1)
MouseClickDrag,Left,x1+1,y1+1,x2-1,y2-1,10
return


find(x=0,y=0,o="x",d=1,c=0)
{
  if o=x
  {
    while color!=c  && (x > 0) && (x < A_ScreenWidth)
    {
      x+=d
      PixelGetColor,color,x,y
      tooltip,%x% %y%,x+5,y+5
    }
    tooltip
    return x
  }
  else if o=y
  {
    while (color!=c) && (y > 0) && (y < A_ScreenHeight)
    {
      y+=d
      PixelGetColor,color,x,y
      tooltip,%x% %y%,x+5,y+5
    }
    tooltip
    return y
  }
}

19

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Можно для обеих координат использовать общий цикл поиска:

; <...> остальной код

find(x=0,y=0,o="x",d=1,c=0)
{
   dx := (o="x") ? d : 0, dy := (o="y") ? d : 0
   while (color!=c)  && (x > 0) && (x < A_ScreenWidth)&& (y > 0) && (y < A_ScreenHeight) {
      x+=dx, y+=dy
      PixelGetColor,color,x,y
      tooltip,%x% %y%,x+5,y+5
   }
   tooltip
   return (o="x") ? x : y
}

20 (изменено: HideGenius, 2015-01-27 20:15:47)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Irbis пишет:

Можно для обеих координат использовать общий цикл поиска:

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

+ ваш код с моими правками
color:=0xffffff, s := 25   ; увеличил скорость, как на больше увиличить не знаю

!d::                                      ; при alt+tab мешает
keywait,d,t
MouseGetPos,x,y
MouseMove 5, -5, , r            ; как и писал у Snagit 2 полоски как у прицела, отводит  "цель" от точки где идет распознавание.
DllCall("Dwmapi\DwmEnableComposition", "UInt", 0)
x1:=find(find(x,y,"x",-s,color)+s,y,"x",-1,color)
y1:=find(x,find(x,y,"y",-s,color)+s,"y",-1,color)
x2:=find(find(x,y,"x",s,color)-s,y,"x",1,color)
y2:=find(x,find(x,y,"y",s,color)-s,"y",1,color)
DllCall("Dwmapi\DwmEnableComposition", "UInt", 1)
MouseClickDrag,Left,x1+1,y1+1,x2-1,y2-1,0     ; увеличил скорость, теперь все мгновенно делаеться
return

find(x=0,y=0,o="x",d=1,c=0)
{
   dx := (o="x") ? d : 0, dy := (o="y") ? d : 0
   while (color!=c)  && (x > 0) && (x < A_ScreenWidth)&& (y > 0) && (y < A_ScreenHeight) {
      x+=dx, y+=dy
      PixelGetColor,color,x,y
      ;tooltip,%x% %y%,x+5,y+5     ; забирает ефект ожидания 
   }
   tooltip
   return (o="x") ? x : y
}

А если для ускорения этого кода сделать чтобы оно не поочередно вычисляли лево, верх, право, низ, а одновременно запускало исследование цвета вверх вправо влево низ. Возможно такое?

21

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

А что нужно написать чтобы скрипт мог распознавать несколько цветов например если нет 0хFFFFFF а нашло 0х000000 то будет считать 2 как за рамку?

color:=0xFFFFFF,0x000000, s=25

Так не получается.

22 (изменено: Irbis, 2015-01-30 14:56:19)

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Переделал для двух цветов, по умолчанию - белый и черный. В paint.net работает.
"Подгонка" 3-мя ступенями, сначала с шагом s2 (25 пикселей), затем с шагом s1 (5 пикселей), и потом с точностью до 1 точки, так должно чуть быстрей.

Насчет "одновременно искать в 4-х направлениях", в теории возможно с запуском одновременно 4-х копий, с передачей им параметров и приемом результатов, на практике все будет более громоздко и не гарантирует большого прироста к скорости.

SetBatchLines -1
s2 := 25, s1 := 5

!lbutton::
keywait,lbutton,t
MouseGetPos,x,y
x1:=f(f(f(x,y,"x",-s2),y,"x",-s1),y,"x",-1)
y1:=f(x,f(x,f(x,y,"y",-s2),"y",-s1),"y",-1)
x2:=f(f(f(x,y,"x",s2),y,"x",s1),y,"x")
y2:=f(x,f(x,f(x,y,"y",s2),"y",s1),"y")
MouseClickDrag,Left,x1,y1,x2,y2,0
return

f(x:=0,y:=0,o:="x",d:=1,c1:=0xffffff,c2:=0x000000)
{
   dx := (o="x") ? d : 0, dy := (o="y") ? d : 0
   while (color!=c1) && (color!=c2)  && (x > 0) && (x < A_ScreenWidth)&& (y > 0) && (y < A_ScreenHeight) {
      x+=dx, y+=dy
      PixelGetColor,color,x,y
      tooltip,O,x+5,y+5
   }
   tooltip
   return (o="x") ? x-dx : y-dy
}

Со сменой цвета (цветов):

SetBatchLines -1
s2 := 25, s1 := 5
c1:=0xffffff,c2:=0x000000
Return

!lbutton::
keywait,lbutton,t
MouseGetPos,x,y
x1:=f(f(f(x,y,"x",-s2,c1,c2),y,"x",-s1,c1,c2),y,"x",-1,c1,c2)
y1:=f(x,f(x,f(x,y,"y",-s2,c1,c2),"y",-s1,c1,c2),"y",-1,c1,c2)
x2:=f(f(f(x,y,"x",s2,c1,c2),y,"x",s1,c1,c2),y,"x",1,c1,c2)
y2:=f(x,f(x,f(x,y,"y",s2,c1,c2),"y",s1,c1,c2),"y",1,c1,c2)
MouseClickDrag,Left,x1,y1,x2,y2,10
return

#1:: ; Смена 1 цвета 
   MouseGetPos,x,y
   PixelGetColor,c1,x,y
Return

#2:: ; Смена 2 цвета
   MouseGetPos,x,y
   PixelGetColor,c2,x,y
Return

f(x:=0,y:=0,o:="x",d:=1,c1:=0xffffff,c2:=0x000000)
{
   dx := (o="x") ? d : 0, dy := (o="y") ? d : 0
   while (color!=c1) && (color!=c2)  && (x > 0) && (x < A_ScreenWidth)&& (y > 0) && (y < A_ScreenHeight) {
      x+=dx, y+=dy
      PixelGetColor,color,x,y
      tooltip,O,x+5,y+5
   }
   tooltip
   return (o="x") ? x-dx : y-dy
}

23

Re: AHK: Движение мышки стрелками и остановка перед белым цветом

Irbis пишет:

Переделал для двух цветов, по умолчанию - белый и черный. В paint.net работает.
"Подгонка" 3-мя ступенями, сначала с шагом s2 (25 пикселей), затем с шагом s1 (5 пикселей), и потом с точностью до 1 точки, так должно чуть быстрей.

Спасибо,работает 1 вариант намного быстрее. Второй вариант универсальней но если фон не одного цвета то кпд падает, поскольку много огрешностей, но мне и 2 цветов хватит.

Насчет "одновременно искать в 4-х направлениях", в теории возможно с запуском одновременно 4-х копий, с передачей им параметров и приемом результатов, на практике все будет более громоздко и не гарантирует большого прироста к скорости.

Понял что больше проблем будет нежели плюсовой результат.