Запилил на коленке костыль, тоже в общем-то подходит, но мб можно что-то пошустрее работающее сделать?
Здесь по горизонтали 135 точек(экран 1920х1080, очевидная формула в 4й строке), по вертикали 120. охват - по окнам 95+%
for($i1,$i1<135) //начинаем с цикла ширины(по ходу скрипта будет проверка hwnd идти сначала сверху вниз, дойдя до нижней границы экрана идет сдвиг вправо и начинаем с верхней границы
$i2=0 //обнуляем итую 2
for($i2,$i2<120) //цикл высоты, итая постоянно обнуляется чтобы не ограничивать наполнение массива только первым рядом hwnd
$pix=hget($i2*15,$i1*7) //получаем hwnd в заданной точке
arrpush($arr,$pix) //вносим данные в массив
end_cyc
logwrite($i1) //лог отчет о завершении каждого вертикального ряда
end_cyc
logwrite(arrsize($arr)) //вывод размера массива
arrsort($arr) //сортировка массива - очешуенно важная штука, ускоряет фильтрацию повторяющихся значений многократно
$i=0
for($i,$i<arrsize($arr)) //цикл фильтрации и вывода
if($i=0)//если цикл совершает первый шаг - значение выводится без проверок
logwrite($arr[$i])
$f_old=$arr[$i] //переменная, содержащая предыдущий вывод
else //если цикл совершает НЕ первый шаг
if($arr[$i]=$f_old) //проверка на совпадение текущего значения с предыдущим
//если совпадает - происходит НИЧЕГО =)
else //если не совпадает - ничего страшного, так тоже бывает
logwrite($arr[$i]," - ",hgettext($arr[$i]))//выводим сам hwnd и имя окна, если доступно.
$f_old=$arr[$i] //тоже заносим инфо для последующей проверки
end_if
end_if
end_cyc