Получение пути POSIX переднего окна Finder - PullRequest
3 голосов
/ 26 июня 2009

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

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

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath]

метод, чтобы получить всех потомков этого пути, используйте "grep" в NSTask (чтобы избежать упаковки инфраструктуры поддержки регулярных выражений) и используйте

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

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

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

Спасибо за проверку моего вопроса!

Andre

PS: я не уверен насчет части grep, может быть, я просто добавлю туда RegexKit Lite ...

Ответы [ 4 ]

5 голосов
/ 26 июня 2009

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

Этот * однострочный у меня работает:

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

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

3 голосов
/ 16 октября 2009

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

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

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

Получение списка окон с использованием углерода

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

Получение уникального идентификатора для окна другого приложения

Это представляет мне массив со всеми окнами всех процессов, упорядоченных по очереди. Так что все, что мне нужно сделать, это извлечь первую запись из массива. Это также может быть использовано для получения скриншота переднего окна, если это полезно для вас, как показано в примере приложения Son of Grab, который был неоценим для меня в качестве рабочего примера.

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

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

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

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

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

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

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

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

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

2 голосов
/ 26 июня 2009

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

Ваш выбор включает:

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

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

0 голосов
/ 02 марта 2019

Можно использовать ScriptingBridge со Swift 4

import Foundation
import ScriptingBridge // imports: ScriptingBridge.SBApplication, .SBElementArray, .SBObject

// SBApplication? to SBApplication to FinderApplication
let finder = (SBApplication(bundleIdentifier: "com.apple.finder")!) as FinderApplication

let windowList: SBElementArray = finder.windows!()
guard windowList.count > 0,
    let window = windowList[0] as? FinderWindow,
    let windowProperties = window.properties,
    let windowTarget = windowProperties["target"] as? FinderFolder,
    let windowUrlOptionalStr = windowTarget.URL,
    let windowUrlSubStr = windowUrlOptionalStr
        .removingPercentEncoding?
        .dropFirst(7) // "file://" 7 characters
else {
    // … handle failure
}

let windowUrl = URL(
    fileURLWithPath: String(windowUrlSubStr),
    isDirectory: true,
    relativeTo: nil)
...