как получить ссылку на ключевое окно активного приложения в Mac OS X

#c #macos

#c #macos

Вопрос:

Я пишу приложение-службу, которое запускается в фоновом режиме и захватывает окно «фокус» в Mac OS X. Окно «фокус» означает, что окно в данный момент получает пользовательский ввод. (в Mac, я думаю, это называется key window )
В настоящее время я использую CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID); для получения списка окон и получения первого окна, чье kCGWindowLayer == 0 . (поскольку список приведен в порядке от начала к концу).

Но это не всегда так. Иногда, если активное приложение выводит немодальное диалоговое окно, немодальное диалоговое окно станет ключевым окном, но это не первое окно с kCGWindowLayer == 0 , поэтому я получу неправильное окно.

Каков правильный метод получения ключевого окна активного приложения? Или обратный вызов уведомления, который может сообщить мне об изменении ключевого окна, также в порядке.

Кроме того, поскольку я работаю в окне, не принадлежащем моему приложению, NSApplication.windowWithWindowNumber может не работать.