Я разрабатываю коммерческое приложение, которое делает именно то, что вы описываете, и я уже много лет общаюсь с различными способами этого. Я разработчик новичка, поэтому я полностью открыт идее, что может быть гораздо лучший способ сделать это, чем мой путь, но он кажется стабильным и работает.
Я использую Apple Script,
Я получаю путь активного документа через каждые 3 секунды, но если активное приложение является Finder, я получаю путь активного окна. Я делаю это с помощью Apple Script, как описано в принятом ответе.
Получение списка окон с помощью копировальной
Чтобы получить список окон всех процессов, чтобы получить идентификатор окна (что-то компания Apple Script не может сделать), я использую CGWindowListCopyWindowInfo, как описано в этом вопросе:
Getting a unique ID for a window of another application
Это представляет собой массив со всеми окнами всех процессов, упорядоченных по фронту. Так что все, что мне нужно сделать, это вырвать первую запись из массива. Это также можно использовать для получения всплывающего окна переднего окна, если это полезно для вас, как показано в примере приложения «Сын графа», что было бесценным для меня в качестве рабочего примера.
Отправка компании Apple Script из какао
Когда речь идет о компании Apple Script, я экспериментировал со всеми 3, что Джим наводит на мысль, и мой вывод заключается в том, что каждый имеет свои проблемы, как с точки зрения стабильности и гибкости.
Apple, менеджер событий зависит от вас отправки сырья компании Apple Events. Для меня это было слишком много, как тяжелая работа и слишком низкий уровень.
Использование NSAppleScript Я нашел медленным и подверженным ошибкам. Это также довольно неуклюжий, если вы хотите отправить все разнообразие Apple Script сообщений, как я.
При прочтении о Scripting Bridge, Я очень взволнован, только чтобы попробовать и очень разочарован. Для атрибутов окон я был пытаясь захватить, он даже не признал их существующими. Казалось, для меня багги и странные. Я ожидаю , если команды, которые вы отправляете, являются , поддерживаемые SB, это был бы лучший вариант .
Четвертый вариант
теперь полагаться на сказочном Objective C обертку вокруг компании Apple Script называется AppScript. Он существует уже много лет, он стабилен, разработчик замечательный, и больше всего он работает.
У этого есть твердые методы рок, которые позволяют Вам послать Apple Script, и он даже вернет ошибки для Вас аккуратно без целой загрузки потенциально глючного и грязного кода, нуждающегося в их проверке.
Я использую его уже год, без проблем. Если у вас есть другие вопросы о том, как это сделать, пожалуйста, не стесняйтесь комментировать, и я постараюсь ответить на них.
Эй, спасибо за то, что вы входите. Ваши объяснения вместе с этим хорошим примером кода действительно проходят долгий путь. – andreb
Нет проблем. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь уточнять этот вопрос. –
Привет, Джон, спасибо за информацию. Я попробовал SonOfGrab, и он показывает мне много «неуместных» окон спереди, таких как пункты меню и т. П. Как вы узнаете, какое окно * действительно * находится впереди? – MrMage