Как получить имя самого первого приложения с AppleScript и использовать его для получения пути к файлу

Что я пытаюсь сделать:

Когда я вхожу в один из своих текстовых редакторов (TextEdit, Byword, FoldingText), я хочу, чтобы этот AppleScript отображал путь к файлу.

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

Проблема:

script уже на 99%, но я чего-то не хватает. Когда я пытаюсь использовать переменную activeApp, она не работает, и я получаю эту ошибку:

Error Number:System Events got an error: Can’t get application {"TextEdit"}.
-1728

Здесь script:

tell application "System Events"
     set activeApp to name of application processes whose frontmost is true

     --This doesn't work either:
     --do shell script "php -r 'echo urldecode(\"" & activeApp & "\");'"

     tell application activeApp
         set myPath to POSIX path of (get file of front document)
     end tell
     display dialog myPath
end tell

Если я обмениваюсь activeApp с "TextEdit", все работает. Помощь будет оценена.

Может быть, здесь есть что-то, что помогает: Получить имя процесса из имени приложения и наоборот, используя Applescript

Ответ 1

Либо получить свойство path документа, либо использовать системные события, чтобы получить value of attribute "AXDocument":

try
    tell application (path to frontmost application as text)
        (path of document 1) as text
    end tell
on error
    try
        tell application "System Events" to tell (process 1 where frontmost is true)
            value of attribute "AXDocument" of window 1
        end tell
        do shell script "x=" & quoted form of result & "
        x=${x/#file:\\/\\/}
        x=${x/#localhost} # 10.8 and earlier
        printf ${x//%/\\\\x}"
    end try
end try

Первый метод не работал с Preview, TextMate 2, Sublime Text или iChm, а второй метод не работал с Acorn. Второй способ требует разрешения доступа для вспомогательных устройств.

Ответ 2

Вы просите...

set activeApp to name of application processes whose frontmost is true

Обратите внимание на "процессы", что означает множественное значение, что вы можете получить несколько процессов в ответ, поэтому applescript дает вам список имен. Хотя только одно приложение возвращается, оно все еще находится в формате списка. Также убедитесь, что ваша ошибка содержит { "TextEdit" }. Скобки вокруг имени означают его список, поэтому ошибка показывает вам проблему.

Вы не можете передать список имен в следующую строку кода. Таким образом, у вас есть несколько вариантов. 1) вы можете запросить только один процесс вместо всех процессов. Это вернет строку вместо списка. Попробуйте этот код...

set activeApp to name of first application process whose frontmost is true

2) вы можете работать со списком, используя "элемент 1 списка". Попробуйте этот код...

set activeApps to name of application processes whose frontmost is true
set activeApp to item 1 of activeApps

Наконец, вы не должны сообщать системным событиям, чтобы сообщить об этом приложению. Отделите эти 2 блока блоков кода. Вот как я напишу ваш код.

tell application "System Events"
    set activeApp to name of first application process whose frontmost is true
end tell

try
    tell application activeApp
        set myPath to POSIX path of (get file of front document)
    end tell

    tell me
        activate
        display dialog myPath
    end tell
on error theError number errorNumber
    tell me
        activate
        display dialog "There was an error: " & (errorNumber as text) & return & return & theError buttons {"OK"} default button 1 with icon stop
    end tell
end try

Я не могу обещать, что код "получить файл переднего документа" будет работать. Это зависит от приложения. Не все приложения поймут этот запрос. Вот почему я использовал блок try. В любом случае, хотя вы можете быть уверены, что обращаетесь к правильному приложению. Удачи.

Ответ 3

Я использовал этот фрагмент некоторое время, кажется, работает для всех приложений Cocoa (не уверен в X11):

set front_app to (path to frontmost application as Unicode text)

tell application front_app
    -- Your code here
end tell

Ответ 4

Ничто из этого не похоже на скомпилированный AppleScript, сохраненный как приложение и помещенный в Dock. Всякий раз, когда вы запускаете приложение, IT - это самый передний, а не приложение, которое показывает его переднее окно. Это приложение становится неактивным, поскольку мой Applescript работает. Как написать приложение Applescript, которое не работает при запуске?

Возможно, я нашел решение проблемы, перечисленной выше. Просто попросите пользователя повторно активировать нужное приложение и дать им время.

tell application "Finder"
   activate
   say "Click front window of your application"
   delay 5
   set myapp to get name of first application process whose frontmost is true 
-- etc.
-- your code
end tell