1

I am trying to create a global hotkey for a function of an app by building an AppleScript in Automator.app and then assign a hotkey to it in Service. But the AppleScript doesn't work.

Specifically, I'm trying to click the Set as system proxy item of ClashX.app.

enter image description here

and the item path is showed as below:

enter image description here

My AppleScript (sorry IDK the corr. syntax highlight):

on run {input, parameters}
    
    tell application "ClashX" 
        tell process "ClashX"
            click menu item "Set as system proxy" of menu 1 of menu bar item 1 of menu bar 2
        end tell
    end tell
end run

and it comes out

Syntax Error: Expected end of line but found “"”.

Note: the process name seems to be "ClashX", but I'm newbie to OS, so I post it here FYI.

enter image description here

0
1

The following example AppleScript code is how you'd click that target menu item:

tell application "System Events" to tell application process "ClashX"
    click menu bar item 1 of menu bar 2
    click menu item "Set as system proxy" of menu 1 of menu bar item 1 of menu bar 2
end tell

That said though, sometimes there can be a delay of several seconds, or more, between the first click and the second click. If you find that to be the case, then try the following example AppleScript code instead:

ignoring application responses
    tell application "System Events"
        click menu bar item 1 of menu bar 2 of application process "ClashX"
    end tell
end ignoring
do shell script "killall 'System Events'"
ignoring application responses
    tell application "System Events"
        click menu item "Set as system proxy" of menu 1 of menu bar item 1 of menu bar 2 of application process "ClashX"
    end tell
end ignoring

However, assigning a global keyboard shortcut for an Automator Service/Quick Action can be difficult at best because finding a keyboard shortcut that will not step on an already assigned keyboard shortcut in every application that you could trigger the Automator Service/Quick Action in will not be easy.

Additionally, every application you do successfully trigger the keyboard shortcut in will have to be added to System Preferences > Security & Privacy > Privacy > Accessibility, and that can be such a pain. Also, you actually may not want a given application to have accessibility privileges for security reasons.

To work around the accessibility privileges issues in a use case such as this I avoid Automator and just use an AppleScript script triggered by a keyboard shortcut using e.g. FastScripts, or a similar type of application. Using FastScripts I find that I typically only have to give it accessibility privileges and not the application that was frontmost when the keyboard shortcut was triggered.

This still leaves the global keyboard shortcut issue though and you may end up having to use four or five keys and the non-modifier key will most likely have to be a symbol.


Note: I am not affiliated with the developer of FastScripts, just a satisfied user of the product.

1
  • Thanks for your help! I tested your solution but it seems not work as I thought. I’m busy this month and haven't check the reason behind yet. But I accept it as the answer because it gives me a path to solve it. I will comment the detailed feedback later! – outsider Sep 27 '20 at 8:46
0

The click command cannot be performed by the application ClashX. The click command can be performed by System Events. Try this instead…

tell application "System Events"
    click menu bar item 1 of menu bar 2 of application process "ClashX"
    click menu item "Set as system proxy" of menu 1 of menu bar item 1 ¬
        of menu bar 2 of application process "ClashX"
end tell

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .