Один из способов - использовать CGWindowListCopyWindowInfo
, чтобы получить список всех окон следующим образом:
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
Изучите этот список, чтобы найти все окна на уровне окна 0 (это обычные окна).
Я вполне уверен, что возвращаемый массив будет в том порядке, в котором окна расположены на экране. Если нет, вы можете отсортировать по ключу "windowOrder". Посмотрите пример кода SonOfGrab, чтобы узнать больше об использовании этого API.