; Цвет возвращается в BGR, если вам нужен RGB, установите последний опц. параметр в отличное от нуля значение.
; hWnd - ID окна
; x и y могут быть представлены относительно ширины и высоты клиентской области:
; для этого замените их массивами типа [a, b], в результате x := a*clientWidth + b; y := a*clientHeight + b
; Точка в центре клиентской области: PixelGetColorBackgroundWinClientArea(hWnd, [0.5,0], [0.5,0])
; Точка на 100 пикселей левее правого края и 50 ниже верхнего: PixelGetColorBackgroundWinClientArea(hWnd, [1,-100], 50)
; Если пытаться взять цвет пикселя за пределами окна, возвращает -1
PixelGetColorBackgroundWinClientArea(hWnd, x, y, RGB:=0) {
VarSetCapacity(pt, 16)
NumPut(x, pt, 0)
NumPut(y, pt, 4)
NumPut(w, pt, 8)
NumPut(h, pt, 12)
if (!DllCall("GetClientRect", "uint", hWnd, "uint", &pt))
Return
if (!DllCall("ClientToScreen", "uint", hWnd, "uint", &pt))
Return
clientX := NumGet(pt, 0, "int")
clientY := NumGet(pt, 4, "int")
clientWidth := NumGet(pt, 8, "int")
clientHeight := NumGet(pt, 12, "int")
WinGetPos, winX, winY, Width, Height, ahk_id %hWnd%
if IsObject(x)
x:=Round(x[1]*clientWidth)+x[2]
if IsObject(y)
y:=Round(y[1]*clientHeight)+y[2]
x+=(clientX - winX), y+=(clientY - winY)
hDC := DllCall("GetDC", Ptr, hWnd, Ptr)
hMemDC := DllCall("CreateCompatibleDC", Ptr, hDC)
hBitmap := DllCall("CreateCompatibleBitmap", Ptr, hDC, Int, Width, Int, Height, Ptr)
DllCall("SelectObject", Ptr, hMemDC, Ptr, hBitmap)
DllCall("PrintWindow", Ptr, hWnd, Ptr, hMemDC, UInt, 0) ; 50-100 ms
ColorBGR := DllCall("GetPixel", Ptr, hMemDC, UInt, x, UInt, y)
DllCall("DeleteObject", Ptr, hBitmap)
DllCall("DeleteDC", Ptr, hMemDC)
DllCall("ReleaseDC", Ptr, hWnd, Ptr, hDC)
if RGB {
fmtI := A_FormatInteger
SetFormat, IntegerFast, Hex
ColorRGB := ColorBGR >> 16 & 0xff | ColorBGR & 0xff00 | (ColorBGR & 0xff) << 16
ColorRGB .= ""
SetFormat, IntegerFast, %fmtI%
Return ColorRGB
} else
Return ColorBGR
}