В applescript, как я могу получить доступ к сочетанию клавиш пункта меню?

Я сделал что-то как то, что Вы, после однажды, и в то время как возможно получить некоторый уровень отражения и доступа к высокоуровневым функциям, головная боль обслуживания не могла бы стоить того. Моя система использовалась для хранения классов UI полностью разделенными от бизнес-логики до делегации сродни понятию Objective C передачи сообщений и передачи. Способ сделать это состоит в том, чтобы создать некоторый базовый класс, который способен к отображающимся символам (я использовал строковый пул, но Вы могли сделать это с перечислениями, если Вы предпочитаете обработку скоростной погрешности и ошибки времени компиляции по общей гибкости) к указателям функции (на самом деле не чистые указатели функции, но что-то подобное тому, что Повышение имеет с Повышением. Функция - к которому у меня не было доступа в то время). Можно сделать то же самое для членских переменных, пока у Вас есть некоторый общий базовый класс, способный к представлению любого значения. Вся система была невозмутимым грабежом Кодирования Значения ключа и Делегации с несколькими побочными эффектами, которые, возможно, стоили чистого количества времени, необходимого для получения каждого класса, который использовал систему для подхождения всех ее методов и участников с легальными вызовами: 1) Любой класс мог назвать любой метод на любом другом классе, не имея необходимость включать заголовки или базовые классы фальшивки записи, таким образом, интерфейс мог быть предопределен для компилятора; и 2) Методов get и методы set членских переменных было легко сделать ориентированным на многопотоковое исполнение, потому что изменение или доступ к их значениям всегда делались через 2 метода в базовом классе всех объектов.

Это также привело к возможности выполнения некоторых действительно странных вещей, которые иначе не легки в C++. Например, я мог создать объект Массива, который содержал произвольные объекты любого типа, включая себя, и создайте новые массивы динамично путем передачи сообщения всем объектам массива и сбора возвращаемых значений (подобный для отображения в Lisp). Другой был реализацией наблюдения значения ключа, посредством чего я смог настроить UI для непосредственного ответа на изменения в членах классов бэкенда вместо того, чтобы постоянно опросить данные или излишне перерисовать дисплей.

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

Оборотные стороны к системе, которая могла бы отговорить Вас беспокоиться: добавление всех сообщений и значений ключа чрезвычайно утомительно; это медленнее, чем без любого отражения; Вы возненавидите наблюдение boost::static_pointer_cast и boost::dynamic_pointer_cast на всем протяжении Вашей кодовой базы с сильной страстью; ограничения системы со строгим контролем типов все еще там, Вы действительно просто скрываете их немного, таким образом, это не столь очевидно. Опечатки в Ваших строках являются также не забавой или легкий обнаружить удивление.

относительно того, как реализовать что-то вроде этого: просто используйте совместно использованные и слабые указатели на некоторую общую базу (мой очень образно назвали "Объектом"), и произойдите для всех типов, которые Вы хотите использовать. Я рекомендовал бы установить Повышение. Функция вместо того, чтобы делать его способ, которым я сделал, который был с небольшим количеством пользовательского дерьма и тонной ужасных макросов для обертывания вызовов указателя функции. Так как все отображается, осмотр возражает, просто вопрос итерации через все ключи. Так как мои классы были по существу максимально близко к прямому грабежу Какао использованием только C++, если бы Вы хотите что-то как этот тогда, я предложил бы использовать документацию Какао в качестве проекта.

5
задан Mike Laurence 8 November 2009 в 00:19
поделиться

1 ответ

It looks the keyboard shortcut information is available as attributes of each menu bar item:

tell application "System Events"
    get name of menu item 2 of menu 3 of menu bar 1 of process "Finder"
        --> "New Folder"
    get every attribute of menu item 2 of menu 3 of menu bar 1 of process "Finder"
           --> {attribute "AXRole" of menu item "New Finder Window" of menu "File" of menu bar item "File" of menu bar 1 of application process "Finder", [...]
    get properties of attribute "AXMenuItemCmdChar" of [...]
        --> {value:"N", class:attribute, settable:false, name:"AXMenuItemCmdChar"}
    get properties of attribute "AXMenuItemCmdModifiers" of [...]
    --> {value:1, class:attribute, settable:false, name:"AXMenuItemCmdModifiers"}

There's some elaboration of the attributes and their values here and detailed reference here.

7
ответ дан 14 December 2019 в 08:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: