Попалась на глаза статья о поиске решения задачи по снятию и сохранению в папку с картинками скриншота желаемого размера в заданной области координат. Очевидно, что моё решение запоздало, но вдруг пригодится, сэкономит кому то время. Использую данный метод в своих AHK-скриптах.
На диске С: создаю папочку "screens"
В шапке прописываю:
file = C:\screens\file.bmp
И ниже функцию:
screen(x,y,w,h, OutputFilePath, hwnd="")
{
hwnd := (hwnd="") ? WinExist("A") : hwnd
pBitmap := Gdip_BitmapFromScreen(0,raster)
if (pBitmap < 1)
pToken := Gdip_StartUp(), pBitmap := Gdip_BitmapFromScreen(0,raster)
pBitmap2 := Gdip_CreateBitmap(w, h)
G2 := Gdip_GraphicsFromImage(pBitmap2), Gdip_SetSmoothingMode(G2, 4), Gdip_SetInterpolationMode(G2, 7)
Gdip_DrawImage(G2, pBitmap, 0, 0, w, h, x, y, w, h)
Gdip_SaveBitmapToFile(pBitmap2, OutputFilePath)
Gdip_DeleteGraphics(G2), Gdip_DisposeImage(pBitmap), Gdip_DisposeImage(pBitmap2)
if (pToken != "")
Gdip_ShutDown(pToken)
}
и далее, когда мне где то в петле, нужен скриншот, чтобы с ним работать, я вызываю функцию:
screen(780, 567, 25, 16, file, EVE - Negociant) ; где первая пара - 780, 657 -это левая верхняя точка области снятия скриншота, вторая пара - 25, 16 - размер области в пикселях, file - произвольное название скриншота, а далее название активного окна, в моем случае, это окно Eve online. После вызова функции даю паузу секунды полторы на выполнение. Пауза тоже непростая, поскольку использую пару таймеров, потому во избежание багов использую такую функцию:
my_sleep(a:=0, b:=0)
{
Random, pz, a, b
end_timer := A_TickCount + pz
while ( A_TickCount <= end_timer )
{
Sleep, 10
}
Return
}
потом повсюду в теле скрипта пишу, например :
my_sleep(1000, 1500)