2

In Zoom Screen Sharing, there is a "meeting controls" window by default, which can get in the way. It is possible to hide it with the ⌘ Command^ Control⌥ OptionH keyboard shortcut, which is nice.

However, if you press the Esc key at any time during the screen share (for example, to stop editing in Vim, or un-focus an input field in a web form), Zoom will show the meeting controls again and steal window focus, which is quite disruptive.

Zoom does not seem to offer any settings to disable this behavior. Relevant Zoom community forum post here: How can I disable Escape key binding in Zoom?

Is there a way to prevent this, perhaps with a tool like Karabiner-Elements?

I think what I want to do is prevent Zoom from listening to the Esc key when I am focused on other windows.

Allan
  • 101,432
rattray
  • 161

3 Answers3

3

I was able to solve this by using Hammerspoon to move the window offscreen.

In daily usage, I press ctrloptshiftH to toggle the meeting controls between the top of the screen off the screen entirely.

This makes it easy to get the meeting controls out of the way, with no esc interference.

Steps:

  1. (Optional). If you want to use the same hotkey, go into Zoom Settings (⌘ Command,), press "Keyboard Shortcuts" on the left", and scroll down to "Show/Hide Floating Meeting Controls" near the bottom, and clear the shortcut so it says "Not set".
  2. Download & install Hammerspoon (I ran brew install hammerspoon in the Terminal). Open the application.
  3. Add the following to ~/.hammerspoon/init.lua:
local originalFrame = nil

hs.hotkey.bind({"cmd", "ctrl", "alt"}, "H", function() local zoomWindow = hs.window.find("zoom share statusbar window") if zoomWindow then if originalFrame then zoomWindow:setFrame(originalFrame) originalFrame = nil else originalFrame = zoomWindow:frame() local screen = zoomWindow:screen() local frame = zoomWindow:frame() frame.x = screen:frame().w + 3000 frame.y = screen:frame().h + 3000 zoomWindow:setFrame(frame) end end end)

To do this, you can open the Terminal application from Spotlight (cmd+space) and then run touch ~/.hammerspoon/init.lua and then open -A Textedit ~/.hammerspoon/init.lua and paste the above script in to the window, save it, and close it.

  1. Restart Hammerspoon, and you're good to go – pressing ⌘ Command^ Control⌥ OptionH will now move the meeting controls offscreen, and pressing it again will move them back to where they were.

Credits:

  1. User whatever1 in this post on the Zoom forum who suggested using BetterTouchTool for this and mentioned the name of the window (thank you!).
  2. ChatGPT, the author of ~all the above Lua code (I made a few tweaks).
rattray
  • 161
1

You can't prevent an app (Zoom in this case) from listening to a key press. All applications are allowed to listen to and for key press events and act accordingly.

It's also important to note that the Zoom developers aren't really doing anything "wrong". Per the macOS Human Interface Guidelines, universal keys and shortcuts (i.e. ⌘ CommandC/V for cut/paste) should be respected. However, nothing is assigned to the Esc when pressed in isolation - that makes it fair game.

That said, it is probably a good idea to share feedback with Zoom as screen sharing is a valuable tool and it doesn't play well with other apps that use Esc for their own functions.

There are two potential workarounds:

  • Use hidutil to remap the Esc to something else. The downside to this is it is system wide meaning it will be remapped for every app. This is probably something you don't want to do.

  • Use a 3rd party App like USB Overdrive ($20USD). This is a key remapping utility similar to ControllerMate (described in detail below). I've not tested this, but it should accomplish the same thing as CM. YMMV.

  • ControllerMate. It's free for a small number of building blocks, so for a single key like this you should be okay. I personally use this to create a "macro-board" for apps like Photoshop Lightroom and Think-or-Swim. You can create programming pages that only apply to specific applications - in your case, Zoom.

    ControllerMate Properties Inspector - Zoom

    This second image is of the "Page Programming sheet" that allows you create "building blocks" of actions. Here I have intercepted the Esc and set it to output a system beep.

    enter image description here

When I tested in Zoom, it seemed to work, but I didn't have a live Zoom call to to try it out on to see if that had any bearing on it's functionality.

Allan
  • 101,432
  • Thanks… I'm struggling to understand, with ControllerMate, how would I tell it to ignore the Esc key? (Note that the behavior is most vexing when Zoom is not the foreground window). – rattray Jan 30 '23 at 02:22
  • BTW, if you'd like to repro, you can boot up an empty Zoom meeting with no participants and still share your screen. This will show the meeting controls ("mute", "stop video", etc) – rattray Jan 30 '23 at 02:23
1

If you're on a mac and don't want to install any additional tools, you could use this Applescript (inspired by ChatGPT):

tell application "System Events"
    set targetAppName to "zoom.us"
    set toolBarWindowName to "zoom share toolbar window"
    set statusBarWindowName to "zoom share statusbar window"
if (get name of every application process) contains targetAppName then
    tell process targetAppName

        -- Get the list of windows for the target application
        set targetWindows to every window

        set toolBarWindow to ""
        set statusBarWindow to ""

        -- Find the window by its name
        repeat with targetWindow in targetWindows
            if name of targetWindow is statusBarWindowName then
                set statusBarWindow to targetWindow
            else if name of targetWindow is toolBarWindowName then
                set toolBarWindow to targetWindow
            end if
        end repeat

        if toolBarWindow is not "" then
            set {statusBarX, statusBarY} to position of statusBarWindow
            set {statusBarWidth, statusBarHeight} to size of statusBarWindow

            set {toolBarX, toolBarY} to position of toolBarWindow
            set {toolBarWidth, toolBarHeight} to size of toolBarWindow

            if toolBarY ≥ 0 then
                -- Move the window outside the screen area
                set position of toolBarWindow to {toolBarX, -toolBarHeight}
                set position of statusBarWindow to {statusBarX, -statusBarHeight}
            else
                -- Show window
                set position of statusBarWindow to {statusBarX, toolBarHeight}
                set position of toolBarWindow to {toolBarX, 0}
            end if
        end if
    end tell
end if

end tell

You can then assign it a keyboard shortcut using Automator's "quick action", the Shortcut.app or Alfred, see more here

Hint: you could use the same ⌘ Command^ Control⌥ OptionH shortcut, but you need to disable it in Zoom's preferences first, as @rattray mentioned in his comment.

DimGun
  • 11