如何创建一个快捷方式来执行xdotool命令以模拟按键操作?

我正在尝试使用自定义快捷键模拟媒体按键的按下。
到目前为止,我已经能够通过以下命令实现所需的模拟:
xdotool key XF86AudioPlay

它完美地工作,每次运行时都会暂停或启动音乐播放器。
问题出现在尝试将其作为快捷方式运行时。
首先,我尝试使用自定义快捷方式运行别名,但没有成功。
this question所解释的那样:
键盘绑定运行的命令不会通过shell解析。你最好在你的主目录下创建一个bin目录。
接下来,我创建了建议的脚本,并将其命名为simplay
#!/bin/sh
xdotool key XF86AudioPlay

它位于 bin 文件夹中,该文件夹是 PATH 的一部分, 这个工作正常,并且可以从任何位置运行。
当尝试创建自定义快捷方式时,我无法使其执行,配置如下:
Name: test
Command: simplay

Shortcut: Ctrl+Alt+R

在进一步搜索后,我找到了另一种执行快捷方式的方法:
gnome-terminal -e simplay

我在终端上尝试了一下,发现当执行它时会迅速打开一个新的终端窗口,执行子进程,暂停音乐然后立即关闭窗口。
我更改了快捷方式上的命令,按下它时注意到相同的行为,打开一个终端然后立即关闭,但这次子进程没有暂停音乐,这让我觉得脚本已经被调用了,但某种原因无法执行。
根据您的知识,我该如何解决这个问题呢?
3个回答

问题

您的快捷方式与模拟按键同时执行

如果您运行一个命令,模拟按键,并且在...另一个按键按下时调用,实际上会模拟出一个第三个按键,即两者的组合:)

解决方法

您需要防止快捷方式与模拟按键同时运行,换句话说,添加一个延迟:

/bin/bash -c "sleep 1 && xdotool key XF86AudioPlay"

将此命令添加到快捷方式中,应该可以正常工作。
注意:
当然,您可以稍微调整sleep 1中的值,将其设置为最舒适的值,这取决于组合键按下的“粘性”程度。也许sleep 0.5就足够了,并且可以使快捷方式更迅速地生效。

你还可以直接在快捷方式定义中使用该命令,这样就不需要为此创建一个独立的脚本。
而不是使用“sleep 1”这个变通方法,你可以使用--clearmodifiers标志,即你的自定义快捷方式将如下所示:
Name: test
Command: xdotool key --clearmodifiers XF86AudioPlay

Shortcut: Ctrl+Alt+R

对我来说,当将快捷键映射为Super+F9时,这个方法很有效。

上面的代码片段是用来作为一个文件吗?如果是的话,您需要将它放在特定的位置或运行特定的命令来实现快捷方式吗? - JellicleCat
1这段代码只是我使用的快捷方式的描述。在Ubuntu中,您可以在键盘设置中创建自定义快捷方式。然而,我已经升级了我的Ubuntu版本,现在可以直接将动作“播放(或播放/暂停)”映射到我选择的按键组合上,这比使用xdotool更可靠。 - Jan
1比使用--clearmodifiers更好的方法是为调用脚本的热键发出一个"keyup"事件。稍微的缺点是,如果你改变了调用脚本的热键,你需要更新脚本。 - vanadium

使用xdotool释放您的快捷键是一个替代方案(以获得更快的性能),而不是使用“sleep 1 && xdotool ...”。这种方法稍微冗长一些,但您也可以使用。
/bin/bash -c "xdotool keyup R Alt_L Ctrl_L && xdotool key XF86AudioPlay"