1 (изменено: Lelik, 2015-07-10 02:13:50)

Тема: Возможные решения отслеживания движения объекта.(АНК)

Есть вот такая задача: отследить за перемещением объекта в окне.Суть в том, что хотелось бы выделить часть объекта, а потом уже отслеживать его перемещения-например ставя на экране точки.
Возможно ли это реализовать через АНК, то не подскажите , на что обратить внимание при написании кода (или имеются где-то куски подобного кода, то был бы признателен за ссылку).
ЗЫ-пробовал через IMAGESearch, но что-то не пошло-не получается в динамике искать...

2

Re: Возможные решения отслеживания движения объекта.(АНК)

Кроме ImageSearch никаких других вариантов нет. Поиск изображения занимает какое-то время, поэтому если оно двигается, результат не гарантирован. Для ускорения поиска можно только максимально сузить границы. Кроме того, обратите внимание на параметры *n и *TransN.

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

3

Re: Возможные решения отслеживания движения объекта.(АНК)

А   не подскажите , есть ли возможность искомую область и ту в которой ведется поиск не заносить в файл для обработки?

4

Re: Возможные решения отслеживания движения объекта.(АНК)

Не понял вопроса. Про какой файл идёт речь? И область у нас только одна — та, которая определяется параметрами X1, Y1, X2, Y2.

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

5

Re: Возможные решения отслеживания движения объекта.(АНК)

Извиняюсь за косноязычие.Я делал следующим образом-выделял область на экране которая мне интересна и перемещение которой нужно отслеживать(т.е. часть объекта или целиком объект), сохранял в файл.Далее сохранял экран.И тогда уже производил поиск через ImageSearch.Через 250 мс заново делал  сохранение экрана и уже в новом сохранении искал.И так по циклу.

6

Re: Возможные решения отслеживания движения объекта.(АНК)

Всё равно не понял, экран-то зачем сохранять. Ищем-то не в скриншоте, а на реальном экране. Изображение, которое ищется, обязательно должно быть в файле, как требует описание команды.

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

7

Re: Возможные решения отслеживания движения объекта.(АНК)

ХМ...честно говоря я не знаю, как так сделать, как вы говорите, это я про поиск на реальном экране без сохранения его тоже в файл. Не подскажите посредством чего это можно реализовать?

8

Re: Возможные решения отслеживания движения объекта.(АНК)

Посредством ImageSearch. Она и ищет на экране, а в файле только искомое изображение.

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

9

Re: Возможные решения отслеживания движения объекта.(АНК)

Извините, я просто не на ты с АНК,как передать скрипту что надо искать на текущем экране?

10

Re: Возможные решения отслеживания движения объекта.(АНК)

А как вы до этого-то искали?

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

11 (изменено: Lelik, 2015-07-10 21:13:19)

Re: Возможные решения отслеживания движения объекта.(АНК)

Раньше открывал файл отскриненный.
Вот сделал вырезание с экрана(по кодам с форума).

If !pToken := Gdip_Startup()
        Throw "Ошибка GDI+!  Убедитесь в наличии gdiplus.dll в вашей системе!"
    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
    obm := SelectObject(chdc, hbm), hhdc := GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y,  0x40000000|0x00CC0020)
    ReleaseDC(hhdc), FileName := "d:\s1.png"  
    pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm) 
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)  
    Gdip_SaveBitmapToFile(pBitmap, FileName), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

а дальше идет код поиска (просто тупо команда:

ImageSearch, xF, yF, 100, 100, 1720, 900, *TransBlack *n250 *wn-1 *hn-1 d:\s1.png

И в итоге постоянно вылетает ошибка AutoHotKey, почему не пойму(причем после второго к примеру запроса в скрипте на поиск.
PS-нужны ли какието директивы для ImageSearch показывающие что надо искать на экране , ну или подобное, я использовал без всяких директив, может изза этого вылетает?

12

Re: Возможные решения отслеживания движения объекта.(АНК)

Повторюсь, ImageSearch всегда ищет именно на экране. Код ваш теперь только в понедельник смогу посмотреть.

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

13

Re: Возможные решения отслеживания движения объекта.(АНК)

Странно удалил все кроме поиска скана участкаэкрана и потом его поискана всем экране, но через некоторое время вылетает ошибка AHK 64

14 (изменено: Доктор ТуамОсес, 2015-07-13 23:18:43)

Re: Возможные решения отслеживания движения объекта.(АНК)

teadrinker пишет:

Поиск изображения занимает какое-то время

http://forum.script-coding.com/viewtopi … 811#p94811

15

Re: Возможные решения отслеживания движения объекта.(АНК)

Доктор ТуамОсес, ознакомьтесь с этой темой, исправьте оформление ссылки.

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

16

Re: Возможные решения отслеживания движения объекта.(АНК)

Lelik, приведите код в том виде, в котором его используете. Какая ошибка?

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

17

Re: Возможные решения отслеживания движения объекта.(АНК)

Ошибка-обнаружена ошибка AutoHotKey 64.... и вес комп уходит в дикие тормоза , да так , что до снятие процесса через диспетчер дойти нереально и лечится перезагрузкой системы..


#Include gdip_All.ahk
Width :=1920 
Height := 1080
DiameterColor := 0xff00ff00   ; цвет диаметра
DiameterThickness := 2  ; толщина диаметра
CoordMode, Pixel, Screen
CoordMode, Mouse, Screen
oGraph := new Graphics(0, 0, Width, Height)




~^LButton:: 
if m!=2
 {
 MouseGetPos, X1, Y1
 x1 := X1
 y1 := Y1
 m=2
 exit
 }

if m!=1
 {
 MouseGetPos, X2, Y2
 x2 := X2
 y2 := Y2
 m=1
 w1:=Abs(x2-x1)
 h1:=Abs(y2-y1)
 
 X:=x1, Y:=y1, W:=w1, H:=h1
 
 If !pToken := Gdip_Startup()
        Throw "Ошибка GDI+!  Убедитесь в наличии gdiplus.dll в вашей системе!"
    chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc)
    obm := SelectObject(chdc, hbm), hhdc := GetDC()
    BitBlt(chdc, 0, 0, w, h, hhdc, x, y,  0x40000000|0x00CC0020)
    ReleaseDC(hhdc), FileName := "d:\s1.png"  
    pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm) 
    SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)  
    Gdip_SaveBitmapToFile(pBitmap, FileName), Gdip_DisposeImage(pBitmap), Gdip_Shutdown(pToken)

  Gui, +LastFound +ToolWindow -Caption +AlwaysOnTop 
  Gui, Color, 354EA3
  Gui, Show, x%X% y%Y% w%W% h%H% NA 
  WinSet, Transparent, 130 
  sleep 500
  Gui,  Hide
 xz:=X
 yz:=Y


;~ESC::Exit
sleep 3000   
ImageSearch, xF, yF, 100, 100, 1720, 900, *TransBlack *n250 *wn-1 *hn-1 *40 d:\s1.png
 
      MsgBox % "Найдено" xF "х" yF "предыдущие " xz "х" yz
      ;sleep 5000
  

 
 } 









class Graphics
{
   __New(GuiX, GuiY, Width, Height)  {
      static WS_EX_LAYERED := 0x80000, WS_EX_TRANSPARENT := 0x20
      
      Pi := 4*(4*ATan(1/5) - ATan(1/239))
      this.Gr := Pi/180
      this.Width := Width
      this.Height := Height
      
      this.pToken := Gdip_Startup()
      Gui, Graphics:Default
      Gui, % "-Caption +E" WS_EX_LAYERED " +ToolWindow +AlwaysOnTop +hwndhGui -DPIScale"
      this.hGui := hGui
      Gui, Show, NA x%GuiX% y%GuiY% w%Width% h%Height%
      
      this.GraphicObjects := []
      this.CreateNewGraphicObj(Width, Height)
   }
   
   __Delete()  {
      this.GraphicObjects := ""
      Gdip_Shutdown(this.pToken)
   }
   
   __Get(key)  {
      if RegExMatch(key, "i)(G|hdc)(\d+)", match)
         Return this.GraphicObjects[match2][match1]
   }
   
   CreateNewGraphicObj(Width, Height)  {
      GrObj := new this.NewGraphicObj(Width, Height)
      Return this.GraphicObjects.Push(GrObj)
   }  
  
   DrawDiameter(color, thickness,x1, y1, x2, y2)  {
      Gdip_GraphicsClear(this.G1, ARGB=0x00ffffff)
      Gr := this.Gr
      pPen := Gdip_CreatePen(color, thickness)
      Gdip_DrawLine(this.G1, pPen, x1, y1, x2, y2)
      Gdip_DeletePen(pPen)
      UpdateLayeredWindow(this.hGui, this.hdc1)
   }
   
      DrawCircle(color, CX, CY, R)  {
      pBrush := Gdip_BrushCreateSolid(color)
      Gdip_FillEllipse(this.G1, pBrush, CX, CY , 2*R, 2*R)
      Gdip_DeleteBrush(pBrush)
      UpdateLayeredWindow(this.hGui, this.hdc1)
   }
   
   
   class NewGraphicObj
   {
      __New(Width, Height)  {
         this.hbm := CreateDIBSection(Width, Height)
         this.hdc := CreateCompatibleDC()
         this.obm := SelectObject(this.hdc, this.hbm)
         this.G := Gdip_GraphicsFromHDC(this.hdc)
         Gdip_SetSmoothingMode(this.G, 4)
      }
      
      __Delete()  {
         SelectObject(this.hdc, this.obm), DeleteObject(this.hbm)
         DeleteDC(this.hdc), Gdip_DeleteGraphics(this.G)
      }
   }
}