1 (изменено: AlexSashka, 2017-08-11 01:19:50)

Тема: AHK: Считывание пикселя/ей и работа сразу в двух окнах

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

2 (изменено: stealzy, 2017-12-13 19:30:22)

Re: AHK: Считывание пикселя/ей и работа сразу в двух окнах

Если кратко, да.
Родной PixelGetColor может не подойти, если нужно много пикселей за один момент, или пиксели в окне не на переднем плане.
Тут вам помогут ф-ии, есть как минимум 3. В них взятие буфера экрана и взятие пикселя из буфера - отдельные действия.
0) встроенная команда PixelGetColor — 20-25 мс все вместе.
1) ф-ия с PrintWindow — буфер 0-100 мс в зависимости от размера окна, пиксель - 0.0040 мс
2) ф-ия с BitBlt — буфер  25-60 мс, пиксель - 0.0100 мс
3) Для десятков пикселей и меньше лучше подойдет ф-ия с GetDCEx - буфер - мгновенно, пиксель - 0.1000-0.3000 мс
4) Используя PrintWindow с LockBits — буфер 50-80, пиксель - 0.0012 (!) мс

+ Gdip_LockBits метод
#Include Gdip_All.ahk
SetBatchLines -1

pixelArray:=[]
pToken := Gdip_Startup()

stBitmap := A_TickCount
pBitmap := Gdip_BitmapFromScreen()
endBitmap := A_TickCount - stBitmap

stX := A_TickCount
width := Gdip_GetImageWidth(pBitmap)
height := Gdip_GetImageHeight(pBitmap)
E1 := Gdip_LockBits(pBitmap, 0, 0, width, height, Stride, Scan0, BitmapData)
endX := A_TickCount - stX

stPix := A_TickCount
loop % width
{
   A_Index_X := A_Index-1
   loop % height
      pixelArray[A_Index_X, A_Index-1] := Gdip_GetLockBitPixel(Scan0, A_Index_X, A_Index-1, Stride)
}
endPix := A_TickCount - stPix

stY := A_TickCount
Gdip_UnlockBits(pBitmap, BitmapData)
Gdip_DisposeImage(pBitmap)
endY := A_TickCount - stY

Gdip_Shutdown(pToken)

msgbox % endBitmap "`n" endX "`n" (endPix) / (width * height) "`n" endY "`n" Format("0x{:x}", pixelArray[1000, 1000])