2009-06-26 2 views
3

Как я могу получить POSIX-путь к окну Finder, который сейчас находится в верхней части его списка окон? Предпочтительно с каким-то каркасом Cocoa, но я открыт для всего.Получение пути POSIX в переднем окне Finder

Background: Мне понадобится это, потому что я хочу сделать выбор файлов, соответствующих шаблону регулярных выражений, начинающему рекурсивно с этого пути. Идея заключается в том, чтобы использовать

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath] 

метод, чтобы получить все потомок этого пути, используйте «Grep» в NSTask (чтобы избежать упаковок регулярок рамки поддержки) и использовать

[[NSWorkspace sharedWorkspace] selectFile:aFile inFileViewerRootedAtPath:thePath] 

в цикле цикл через NSArray, сделанный из записей, возвращаемых grep.

До сих пор я рассматривал NSWorkspace, NSFileManager и NSApplication и другие поисковые запросы по ключевым словам в документации Xcode.

Спасибо за то, что вышли на мой вопрос!

Andre

PS: Я не уверен в Grep части, может быть, я просто пощечина RegexKit Lite там ...

ответ

3

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

Я использую Apple Script,

Я получаю путь активного документа через каждые 3 секунды, но если активное приложение является Finder, я получаю путь активного окна. Я делаю это с помощью Apple Script, как описано в принятом ответе.

Получение списка окон с помощью копировальной

Чтобы получить список окон всех процессов, чтобы получить идентификатор окна (что-то компания Apple Script не может сделать), я использую CGWindowListCopyWindowInfo, как описано в этом вопросе:

Getting a unique ID for a window of another application

Это представляет собой массив со всеми окнами всех процессов, упорядоченных по фронту. Так что все, что мне нужно сделать, это вырвать первую запись из массива. Это также можно использовать для получения всплывающего окна переднего окна, если это полезно для вас, как показано в примере приложения «Сын графа», что было бесценным для меня в качестве рабочего примера.

Отправка компании Apple Script из какао

Когда речь идет о компании Apple Script, я экспериментировал со всеми 3, что Джим наводит на мысль, и мой вывод заключается в том, что каждый имеет свои проблемы, как с точки зрения стабильности и гибкости.

  1. Apple, менеджер событий зависит от вас отправки сырья компании Apple Events. Для меня это было слишком много, как тяжелая работа и слишком низкий уровень.

  2. Использование NSAppleScript Я нашел медленным и подверженным ошибкам. Это также довольно неуклюжий, если вы хотите отправить все разнообразие Apple Script сообщений, как я.

  3. При прочтении о Scripting Bridge, Я очень взволнован, только чтобы попробовать и очень разочарован. Для атрибутов окон я был пытаясь захватить, он даже не признал их существующими. Казалось, для меня багги и странные. Я ожидаю , если команды, которые вы отправляете, являются , поддерживаемые SB, это был бы лучший вариант .

Четвертый вариант

теперь полагаться на сказочном Objective C обертку вокруг компании Apple Script называется AppScript. Он существует уже много лет, он стабилен, разработчик замечательный, и больше всего он работает.

У этого есть твердые методы рок, которые позволяют Вам послать Apple Script, и он даже вернет ошибки для Вас аккуратно без целой загрузки потенциально глючного и грязного кода, нуждающегося в их проверке.

Я использую его уже год, без проблем. Если у вас есть другие вопросы о том, как это сделать, пожалуйста, не стесняйтесь комментировать, и я постараюсь ответить на них.

+0

Эй, спасибо за то, что вы входите. Ваши объяснения вместе с этим хорошим примером кода действительно проходят долгий путь. – andreb

+0

Нет проблем. Если у вас есть дополнительные вопросы, пожалуйста, не стесняйтесь уточнять этот вопрос. –

+0

Привет, Джон, спасибо за информацию. Я попробовал SonOfGrab, и он показывает мне много «неуместных» окон спереди, таких как пункты меню и т. П. Как вы узнаете, какое окно * действительно * находится впереди? – MrMage

5

Вы, вероятно, может попросить Finder это с помощью AppleScript.

Это * один лайнер работает для меня:

osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)' 

* модифицированная версия this.

+0

ah right ... Я полностью забыл о AppleScript. Очень приятно знать это как план резервного копирования. Не могли бы вы также узнать указатель или два, чтобы справиться с этим в Cocoa/Carbon? Интересно, как http://www.manytricks.com/witch получает список всех окон ... спасибо, что написал это :) – andreb

+0

Я не знаю интерфейса Cocoa/Carbon, который позволяет изучить список окон другого процесса. И даже если бы вы могли, как бы вы определили, к какому пути это соответствовало? –

+0

Спасибо за это, это именно то, чем я был. Сначала мне не хватало преобразования в псевдоним. Я попытался сделать что-то вроде «как путь POSIX» вместо вашего «как псевдоним» и «путь POSIX (цель окна 1)», которому не повезло. Мне кажется смущенным, что вам сначала нужно перейти на псевдоним ..! –

2

Получение пути POSIX, представленного самым передним окном в Finder, будет включать отправку событий Apple в Finder так или иначе.

Ваши варианты включают:

  • Используя Apple, менеджер событий (или NSAppleEventDescriptor и друзей) напрямую.
  • Использование объектов NSAppleScript или OSAScript.
  • Использование ScriptingBridge.

Если вы строите приложение Cocoa, OSAScript, вероятно, является самым естественным выбором.

+0

Спасибо за ваш ответ, сэр! Несколько имен уже достаточно ... рассмотрим AEM/OSAScript. Если это будет слишком сложно для моего дизайнерского ума, я, вероятно, придерживаюсь плана резервного копирования: D Снова спасибо вам обоим. Ваши ответы были полезными. Andre – andreb

+0

Так это убьет вас, чтобы принять его? –

+0

жаль, что раньше этого не делал. У меня создалось впечатление, что тот, у кого больше всего голосов, получит этот статус автоматически. – andreb

Смежные вопросы