1 (изменено: ypppu, 2012-12-13 20:14:42)

Тема: AHK: Поиск пикселя и щелчок ЛКМ

Когда в опр. точке появляется опр. пискель, то скрипт делает команду, в данном случае - Клик.
Так вот, помогите, в PixelSearch вообще  не шарю.

2

Re: AHK: Поиск пикселя и щелчок ЛКМ

Если точка "определена" то известны её координаты.
Если есть понятие "определённый пиксель" то есть значение цвета сего пикселя.
PixelGetColor

Если желаемое действие - клик: MouseClick

На всякий случай: Список команд Autohotkey

3

Re: AHK: Поиск пикселя и щелчок ЛКМ

Если по принципу множественных кликов когда под курсором нужный цвет, то вот как вариант:

SetTimer, WatchCursor, 100 ; частота таймера
WatchCursor:
   MouseGetPos, XPos, YPos
   PixelGetColor, CurrentColor, XPos, YPos, Slow RGB
   If CurrentColor = 0x0000FF ; к примеру синий
      Click ; посылается левый клик с частотой таймера
   Return

, если принцип есть_цвет_зажал/нет_цвета_отпустил:

SetTimer, WatchCursor1, 100
WatchCursor1:
   MouseGetPos, XPos, YPos
   PixelSearch,,, XPos-25
                , YPos-25
                , XPos+25
                , YPos+25
                , 0x0000FF,, Fast RGB ; зона поиска 50х50 от центра курсора
   If !ErrorLevel
   {
      MouseClick, L,,,,, D
      SetTimer, WatchCursor1, Off
      SetTimer, WatchCursor2, 100
   }
   Return
WatchCursor2:
   MouseGetPos, XPos, YPos
   PixelSearch,,, XPos-25
                , YPos-25
                , XPos+25
                , YPos+25
                , 0x0000FF,, Fast RGB
   If ErrorLevel
   {
      MouseClick, L,,,,, U
      SetTimer, WatchCursor2, Off
      SetTimer, WatchCursor1, 100
   }
   Return

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

4

Re: AHK: Поиск пикселя и щелчок ЛКМ

Прошу прощения что страрую тему поднимаю.
2 Grey:
Ни один их приведенных вами примеров в D3D не работает -поверял в 3х пректах.

Причины всего 2:

1)AHK использует RGB определение цвета, а все D3D (последние лет 7 точно) используют RGBA .Добавляется альфа канал.
(Приведенный в коде синий цвет, долже быть 0000FFFF в этом случае.)
Можно ли в AHK задать RGBA из документации я не понял. скорее всего нужно делать вызов
сторонней DLL

2)D3D использует X,Y,Z систему координат.

5

Re: AHK: Поиск пикселя и щелчок ЛКМ

2TonyMontana

TonyMontana пишет:

Ни один их приведенных вами примеров в D3D не работает...

Вообще-то, кто ищет цвет/изображение, или пытается, что-то от рисовать (поверх) в полноэкранных приложениях делают это при условии, что само приложение запускается в оконном режиме. Это является наиболее простым вариантом, нежели вырисовывать, что-то в Direct3D. Вот так к примеру нахожу нужный цвет в CS:S:

Numpad2::
NumpadDown::
   If !hWnd
   {
      offSet:=25
      WinSet, AlwaysOnTop, Off, % "ahk_id"hWnd:=WinActive("A")
      WinGetPos, xWnd, yWnd, wWnd, hWnd_, % "ahk_id"hWnd
      WinMove, % "ahk_id"hWnd,, 0, 0, A_ScreenWidth, A_ScreenHeight
      WinSet, Style, -0xC00000, % "ahk_id"hWnd
   }
   Loop, % (isEnable:=!isEnable) ? 1:2
      SoundBeep, 7500, 100
   SetTimer, WatchCursor1, % isEnable ? 100:"Off"
   SetTimer, WatchCursor2, Off
   SetTimer, WatchCursor3, % isEnable ? 100:"Off"
   If !isEnable
      SetTimer, RemoveTips, -100
   KeyWait, % A_ThisHotkey
   Return

~Esc::
   KeyWait, Esc
   If A_TimeSinceThisHotkey>1000
      Goto, ExitScript
   Return

WatchCursor1:
   MouseGetPos, xPos, yPos
   PixelGetColor, currentColor, xPos, yPos, Fast RGB
   PixelSearch,,, xPos-offSet
                , yPos-offSet
                , xPos+offSet
                , yPos+offSet
                , 0xFFFFFF,, Fast RGB
   If !ErrorLevel
   {
;       MouseClick, L,,,,, D
      SetTimer, WatchCursor1, Off
      SetTimer, WatchCursor2, 100

      ToolTip, % "found!`ncurrent: "currentColor "`nxPos: "xPos ", yPos: "yPos
             , A_ScreenWidth-384, A_ScreenHeight-185, 1
      ToolTip,,,, 2
      SoundBeep, 12500, 100
   }
   Return

WatchCursor2:
   MouseGetPos, xPos, yPos
   PixelGetColor, currentColor, xPos, yPos, Fast RGB
   PixelSearch,,, xPos-offSet
                , yPos-offSet
                , xPos+offSet
                , yPos+offSet
                , 0xFFFFFF,, Fast RGB
   If ErrorLevel
   {
;       MouseClick, L,,,,, U
      SetTimer, WatchCursor2, Off
      SetTimer, WatchCursor1, 100

      ToolTip, % "lost!`ncurrent: "currentColor "`nxPos: "xPos ", yPos: "yPos
             , A_ScreenWidth-384, A_ScreenHeight-130, 2
      ToolTip,,,, 1
      SoundBeep, 750, 100
   }
   Return

WatchCursor3:
   MouseGetPos, xPos2, yPos2
   PixelGetColor, currentColor2, xPos2, yPos2, Fast RGB
   ToolTip, % "current (cursor): "currentColor2 "`nxPos: "xPos2 ", yPos: "yPos2
          , A_ScreenWidth-250, A_ScreenHeight-170, 3
   Return

ExitScript:
   WinMove, % "ahk_id"hWnd,, xWnd, yWnd, wWnd, hWnd_
   WinSet, Style, +0xC00000, % "ahk_id"hWnd
   ExitApp

RemoveTips:
   ToolTip,,,, 1
   ToolTip,,,, 2
   ToolTip,,,, 3
   Return

Но такой код не даст результата в BFBC2, всё по тому, что в CS:S курсор приложение "держит" в середине экрана, а в BFBC2 курсор "гуляет" по всему экрану. По этому такой код универсальнее:

OnExit, ExitScript

Numpad2::
NumpadDown::
   If !hWnd
   {
      offSet:=25
      WinSet, AlwaysOnTop, Off, % "ahk_id"hWnd:=WinActive("A")
      WinGetPos, xWnd, yWnd, wWnd, hWnd_, % "ahk_id"hWnd
      WinMove, % "ahk_id"hWnd,, 0, 0, A_ScreenWidth, A_ScreenHeight
      WinSet, Style, -0xC00000, % "ahk_id"hWnd
   }
   Loop, % (isEnable:=!isEnable) ? 1:2
      SoundBeep, 7500, 100
   SetTimer, WatchCursor1, % isEnable ? 100:"Off"
   SetTimer, WatchCursor2, Off
   SetTimer, WatchCursor3, % isEnable ? 100:"Off"
   If !isEnable
      SetTimer, RemoveTips, -100
   KeyWait, % A_ThisHotkey
   Return

~Esc::
   KeyWait, Esc
   If A_TimeSinceThisHotkey>1000
      Goto, ExitScript
   Return

WatchCursor1:
   MouseGetPos, xPos, yPos
   PixelGetColor, currentColor, xPos, yPos, Fast RGB
   PixelSearch,,, A_ScreenWidth//2-offSet
                , A_ScreenHeight//2-offSet
                , A_ScreenWidth//2+offSet
                , A_ScreenHeight//2+offSet
                , 0xFFFFFF,, Fast RGB
   If !ErrorLevel
   {
;       MouseClick, L,,,,, D
      SetTimer, WatchCursor1, Off
      SetTimer, WatchCursor2, 100

      ToolTip, % "found!`ncurrent: "currentColor "`nxPos: "xPos ", yPos: "yPos
             , A_ScreenWidth-384, A_ScreenHeight-185, 1
      ToolTip,,,, 2
      SoundBeep, 12500, 100
   }
   Return

WatchCursor2:
   MouseGetPos, xPos, yPos
   PixelGetColor, currentColor, xPos, yPos, Fast RGB
   PixelSearch,,, A_ScreenWidth//2-offSet
                , A_ScreenHeight//2-offSet
                , A_ScreenWidth//2+offSet
                , A_ScreenHeight//2+offSet
                , 0xFFFFFF,, Fast RGB
   If ErrorLevel
   {
;       MouseClick, L,,,,, U
      SetTimer, WatchCursor2, Off
      SetTimer, WatchCursor1, 100

      ToolTip, % "lost!`ncurrent: "currentColor "`nxPos: "xPos ", yPos: "yPos
             , A_ScreenWidth-384, A_ScreenHeight-130, 2
      ToolTip,,,, 1
      SoundBeep, 750, 100
   }
   Return

WatchCursor3:
   MouseGetPos, xPos2, yPos2
   PixelGetColor, currentColor2, xPos2, yPos2, Fast RGB
   PixelGetColor, currentColor3, A_ScreenWidth//2, A_ScreenHeight//2, Fast RGB
   ToolTip, % "current (cursor): "currentColor2 "`nxPos: "xPos2 ", yPos: "yPos2
          , A_ScreenWidth-250, A_ScreenHeight-170, 3
   ToolTip, % "current (center): "currentColor3
          . "`nxPos: "A_ScreenWidth//2 ", yPos: "A_ScreenHeight//2
          , A_ScreenWidth-250, A_ScreenHeight-130, 4
   Return

RemoveTips:
   ToolTip,,,, 1
   ToolTip,,,, 2
   ToolTip,,,, 3
   ToolTip,,,, 4
   Return

ExitScript:
   WinMove, % "ahk_id"hWnd,, xWnd, yWnd, wWnd, hWnd_
   WinSet, Style, +0xC00000, % "ahk_id"hWnd
   ExitApp
TonyMontana пишет:

...все D3D (последние лет 7 точно) используют RGBA .

Не вижу проблемы, так как в PixelSearch есть параметр отвечающий за вариацию искомого цвета.

TonyMontana пишет:

...D3D использует X,Y,Z систему координат.

Мне как-то всё равно на сей счёт, ибо aимбoтaми не занимаюсь. Если нужно сдвинуть курсор, то это прекрасно получается через X, Y.