如何防止锤勺热键覆盖其他应用程序中的热键?

dop*_*umi 5 hammerspoon

我正在寻找仅在 Google Chrome 中可用的特定热键:

hs.hotkey.bind({"cmd"}, "0", function()
  if hs.window.focusedWindow():application():name() == 'Google Chrome' then
    hs.eventtap.keyStrokes("000000000000000000")
  end
end)
Run Code Online (Sandbox Code Playgroud)

这种方法的问题是热键将在其他应用程序上变得不可用。例如CMD+0不会触发Reset ZoomDiscord 中的命令。

我怎样才能防止这种情况发生?

小智 9

该hs.hotkeyAPI 不提供传播捕获的 keydown 事件的功能。APIhs.eventtap可以,但使用它需要监视每个 keyDown事件。

我将指出一个有点相关的GitHub 问题中提到的内容:

如果您希望组合键对大多数应用程序执行某些操作,但不希望对某些特定应用程序执行某些操作,则最好使用窗口过滤器或应用程序观察器,并在活动应用程序更改时启用/禁用热键。

换句话说,对于您想要实现的目标,建议您使用 APIhs.window.filter在进入应用程序时启用热键绑定,并在离开应用程序时禁用它,即:

-- Create a new hotkey
local yourHotkey = hs.hotkey.new({ "cmd" }, "0", function()
    hs.eventtap.keyStrokes("000000000000000000")
end)

-- Initialize a Google Chrome window filter
local GoogleChromeWF = hs.window.filter.new("Google Chrome")

-- Subscribe to when your Google Chrome window is focused and unfocused
GoogleChromeWF
    :subscribe(hs.window.filter.windowFocused, function()
        -- Enable hotkey in Google Chrome
        yourHotkey:enable()
    end)
    :subscribe(hs.window.filter.windowUnfocused, function()
        -- Disable hotkey when focusing out of Google Chrome
        yourHotkey:disable()
    end)
Run Code Online (Sandbox Code Playgroud)