Получить список всех ярлыков из другого приложения

1

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

Я хотел бы использовать это в простом приложении Python, которое я пишу, чтобы упростить процесс настройки моего Wacom-планшета для разных приложений. Это действительно не должно быть "чистым" решением, я рад, если я могу просто получить список, созданный один раз, а затем прочитать его в моей программе.

Я раньше играл с AppleScript, поэтому, если это возможно сделать через AS, это тоже было бы неплохо.

  • 0
    Похоже, это тот же вопрос, хотя я не нашел его, пока не погуглил «AXMenuItemCmdChar»: stackoverflow.com/questions/1694891/…
  • 0
    Эти парни, кажется, нашли хороший способ делать то, что я хочу: ergonis.com/products/keycue
Теги:
macos
keyboard-shortcuts
applescript

2 ответа

2
Лучший ответ

Вероятно, вам придется использовать скрипты gui, что означает, что приложение должно быть открыто. Я попробовал это с Safari. Если вы посмотрите в меню "Файл", 6-й пункт меню - это пункт меню "Закрыть окно", в котором есть комбинация клавиш shift-cmd-w. Я нацелился на это, чтобы увидеть, могу ли я его получить...

tell application "System Events"
    tell process "Safari"
        -- get the menu bar items from the main menu
        tell menu bar 1
            set menuBarItems to menu bar items -- apple menu, application menu, file menu etc.
        end tell

        -- get the menu items from a menu bar item
        set fileMenuBarItem to item 3 of menuBarItems -- the file menu
        tell menu 1 of fileMenuBarItem -- you have to have "menu 1" here
            set menuItems to menu items
        end tell

        -- query the menu bar item
        set closeWindowMenuItem to item 6 of menuItems -- close window menu item
        tell closeWindowMenuItem
            return {name, value} of attributes
        end tell
    end tell
end tell

Если вы посмотрите на результаты, есть пара интересных атрибутов этого пункта меню. Он имеет атрибут "AXMenuItemCmdChar", который дает мне "w" сочетания клавиш. Поэтому мы знаем, что "cmd-w" является частью ярлыка. Другой атрибут под названием "AXMenuItemCmdModifiers" существует со значением 1. Это должен быть символ сдвига.

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

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

  • 0
    Спасибо, я начал играть с этим сейчас. Одна вещь, которую я заметил, заключается в том, что некоторые параметры в строке меню, которые зависят от того, в каком представлении я нахожусь, не отображаются, если я не вывожу Lightroom вперед.
  • 0
    Это довольно волосато, но, по крайней мере, это работает ... :)
Показать ещё 1 комментарий
0
do shell script "date '+%T' > /0/ase.txt"

set proc to "AppleScript Editor"
tell application "System Events" to tell process proc
    set out to ""
    set v to menu bar item 4 of menu bar 1
    -- repeat with v in menu bar items 2 thru -1 of menu bar 1
    set out to out & name of v & linefeed
    repeat with w in menu items of menu 1 of v
        set out to out & "  " & my getshortcut(proc, w) & "  " & name of w & linefeed
        try
            repeat with x in menu items of menu 1 of w
                set out to out & "    " & my getshortcut(proc, x) & "  " & name of x & linefeed
            end repeat
        end try
    end repeat
    -- end repeat
end tell

on getshortcut(proc, x)
    set text item delimiters to space
    set menuglyphs to text items of "2 ⇥ 3 ⇤ 4 ⌤ 9 ␣ 10 ⌦ 11  16 ↓ 23 ⌫ 24 ← 25 ↑ 26 → 27 ⎋ 28 ⌧ 98 ⇞ 99 ⇪ 100 ← 101 → 102  104 ↑ 105  106 ↓ 107 ⇟ 111 F1 112 F2 113 F3 114 F4 115 F5 116 F6 117 F7 118 F8 119 F9 120 F10 121 F11 122 F12 135 F13 136 F14 137 F15 140  143 F16 144 F17 145 F18 146 F19"
    set cmdmods to text items of "⌘ ⇧⌘ ⌥⌘ ⌥⇧⌘ ⌃⌘ ⌃⇧⌘ ⌃⌥⌘ ⌃⌥⇧⌘ - ⇧ ⌥ ⌥⇧ ⌃ ⌃⇧ ⌃⌥ ⌃⌥⇧"
    tell application "System Events" to tell process proc
        set c to ""
        try
            set n to value of attribute "AXMenuItemCmdModifiers" of x
            set modifier to item (n + 1) of cmdmods
            try
                set c to (value of attribute "AXMenuItemCmdChar" of x)
                c as text
                return modifier & c
            on error
                set glyph to (value of attribute "AXMenuItemCmdGlyph" of x) as text
                repeat with i from 1 to (count menuglyphs)
                    if item i of menuglyphs is glyph then
                        return modifier & item (i + 1) of menuglyphs
                    end if
                end repeat
            end try
        end try
        return "-"
    end tell
end getshortcut


do shell script "echo " & quoted form of out & "`date '+%T'` >> /0/ase.txt"
out

Это очень медленно (полный script занимает около 3-10 минут для запуска на моей машине), но, по крайней мере, это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню