Определить, какая часть окна видима, можно сосчитав, сколько точек окна перекрыто другими окнами, лежащими выше него, и краем монитора. Хэндлы окон в порядке сверху до низу возвращает команда
Будем проверять каждую точку окна, перекрыта она, или нет. Наверное, не очень рационально по скорости, но алгоритм высчитывания и вычитания перекрытых площадей (а окно могут перекрывать несколько других окон, в свою очередь, перекрывающих друг друга) будет гораздо более сложным.
hWnd = ; указать реальный хэндл окна
SetBatchLines -1
MsgBox, % GetVisibleSquare(hWnd)
Return
GetVisibleSquare(hWnd)
{
if !WinExist("ahk_id " hWnd)
Return "Видимого окна с данным хэндлом не существует!"
SquareCovered := i := 0
WinGetPos, X, Y, W, H, ahk_id %hWnd%
X1 := X < 0 ? 0 : X
Y1 := Y < 0 ? 0 : Y
X2 := X + W > A_ScreenWidth ? A_ScreenWidth : X + W
Y2 := Y + H > A_ScreenHeight ? A_ScreenHeight : Y + H
SquareReal := W * H
SquareOnScreen := (X2 - X1) * (Y2 - Y1) ; площадь, не перекрытая краем монитора
WinGet, List, List
While List%A_Index% != hWnd
{
i++
WinGetPos, X, Y, W, H, % "ahk_id " List%A_Index%
X1_%i% := X < 0 ? 0 : X
Y1_%i% := Y < 0 ? 0 : Y
X2_%i% := X + W > A_ScreenWidth ? A_ScreenWidth : X + W < 0 ? 0 : X + W
Y2_%i% := Y + H > A_ScreenHeight ? A_ScreenHeight : Y + H < 0 ? 0 : Y + H
if (X1_%i% <= X1 && X2 <= X2_%i% && Y1_%i% <= Y1 && Y2 <= Y2_%i%)
Return 0 ; окно полностью перекрывает целевое
if (X1_%i% > X2 || X1 > X2_%i% || Y1_%i% > Y2 || Y1 > Y2_%i%) ; окно не перекрывает целевое
i-- ; отсеиваем его из дальнейшей проверки
}
if i = 0
Return 100 - Round((SquareReal - SquareOnScreen)*100/SquareReal)
Loop % Y2 - Y1
{
Y := Y1 + A_Index - 1
Loop % X2 - X1
{
X := X1 + A_Index - 1
Loop % i
{
if (X >= X1_%A_Index% && X <= X2_%A_Index% ; проверяем, перекрыта ли данная точка
&& Y >= Y1_%A_Index% && Y <= Y2_%A_Index%)
{
SquareCovered++
Break
}
}
}
}
Return 100 - Round((SquareCovered + SquareReal - SquareOnScreen)*100/SquareReal)
}
Правда, такой алгоритм сработает только для стандартных, прямоугольных окон.
Разработка AHK-скриптов:
e-mail
dfiveg@mail.ruTelegram
jollycoder