#macos #vba #applescript #powerpoint #office-2016
#macos #vba #applescript #powerpoint #office-2016
Вопрос:
Мне нужно открыть приложение OS X при открытии любой презентации PowerPoint. Я получил обратный вызов VBA при открытии powerpoint (Auto_Open ()). Но мне нужен обратный звонок для каждой открытой презентации.
В Windows мы можем открывать каждую презентацию в отдельном приложении PowerPoint (экземпляр difference). На Mac приложение Powerpoint откроется один раз, и все презентации будут открываться в том же приложении PowerPoint (Powerpoint 2016- версия для Mac).
Мне нужен обратный вызов при открытии каждого файла презентации, и мне нужно выполнить фрагменты кода запуска в моем приложении cocoa.
Комментарии:
1. Возможно, вы сможете связать что-то вместе, используя
fswatch
(install withhomebrew
) для рекурсивного просмотра пользовательских папок на предмет открытия файлов PDF-файлов. Или, может быть, что-то с или что-то подобное.sudo opensnoop -n PowerPoint
2. «В Windows мы можем открывать каждую презентацию в отдельном приложении PowerPoint (экземпляр difference)» На самом деле нет, вы не можете. Последние версии позволяют открывать несколько файлов в отдельных окнах, но есть только один экземпляр приложения. Возможно, ваше приложение может периодически запрашивать PPT для презентаций. Свойство Count, возможно, поддерживает массив / список имен каждой открытой презентации для проверки. В Windows PPT может перехватывать событие, возникающее при открытии презентаций, но, насколько я знаю, это не поддерживается в Mac PPT.
3. @SteveRindsberg: В Windows для меня это новая информация. Спасибо за обновление и в Mac PPT поддерживает только несколько событий. В приложении ppt есть одно событие. Событие PresentationOpen, я думаю, оно перезвонит при открытии каждой презентации. Но это событие не поддерживается в версии для Mac. Есть ли какой-либо другой способ определить, когда презентация открыта? Что-нибудь вроде мониторинга активности Mac или что-то в этом роде?
4. @SivaprasadKm Насколько я знаю, но я мало что знаю о Mac, кроме того, что происходит в VBA. Возможно, есть какой-то способ сделать это с помощью Applescript или тому подобного. Ах. Я вижу, что pbell привел вам возможный пример.
Ответ №1:
Идея возможного обхода заключается в циклической проверке открытых презентаций и сравнении ее с презентациями, уже открытыми ранее.
Во-первых, когда запускается этот скрипт, он проверяет, запущен ли PowerPoint (-> если нет, то завершите работу). Если запускается PP, скрипт записывает количество открытых презентаций.
Затем скрипт проходит цикл: в этом примере он повторяется 100 раз (только для моего теста, но он должен повторяться вечно!). Для каждой итерации он ищет список презентаций PP и сравнивает со списком ранее: если презентации нет в предыдущем списке, значит, она новая, просто откройте!
Сценарий также останавливается, когда вы выходите из PowerPoint, показывая предупреждение (попытка блокировки).
tell application "System Events" to set PP_Running to exists (processes where name is "Microsoft PowerPoint")
if not PP_Running then return -- Power point is not launched !
tell application "Microsoft PowerPoint" to set Old_list to name of every presentation -- get initial list of open presentations
repeat with I from 1 to 100 -- for test, but it should be repeat with no limit
try
tell application "Microsoft PowerPoint" to set New_list to name of every presentation
on error
display alert "PowerPoint no longer launched"
return -- quit the loop
end try
repeat with aDoc in New_list
if not (Old_list contains aDoc) then -- new document has been opened !!
set Old_list to New_list
log "Open new document = " amp; aDoc -- do what ever you need to do !!
end if
end repeat
delay 0.5
set I to I 1
end repeat
Проверено на El Capitain / PP 2011: но я думаю, что с PP 2011 по PP 2016 в «названии каждой презентации» ничего не изменилось.