自从 =~ 2 年以来,我们似乎无法使用该Super键(又名 Windows 键)来运行某些键盘快捷键。
我尝试使用 kde、gnome、xfce4,但没有一个完全有效。
例如,我有一个键盘快捷键来输入日期,就像我输入通过Super+分配的日期一样a,当我按此键时,什么也没有发生。
命令行在bash -c 'xvkbd -xsendevent -text $(date +%Y%m%d)'
xfce4 首选项中配置正确。
我目前使用 archlinux x86_64,内核为 4.15.1-2-ARCH。
任何人都知道出了什么问题吗?在哪里 ?有解决办法吗?解决方法?
答案1
使用的快捷键不是问题
bash …
您可以通过将命令替换为xterm
(或其他图形应用程序)来检查键盘快捷键是否已成功设置。如果出现一个窗口,则表明您的快捷方式设置正确。相反,问题几乎肯定是所需的命令:
bash -c 'xvkbd -xsendevent -text $(date +%Y%m%d)'
根据我的经验,使用XSendEvent
是不可靠的。1 这可能是您问题的根源。使用xdotool
一个可以在XTEST
和之间进行选择XSendEvent
,前者通常适合我。您xvkbd
可能有类似的选择。
发送按键序列时,您需要清除当前修饰符,以确保发送您想要的序列(例如,test
而不是Super+ t、Super+e等)
此外,xdotool
至少有一个奇怪的行为,如果它发送事件太快,它们就会消失。2这实际上可能是 X 服务器丢弃事件,也可能是完全不同的情况。无论如何,您可以xdotool
延迟解决这个问题(至少在 ):
xdotool sleep 0.125 type --clearmodifiers 'string to type'
该type
子命令有一个--delay
选项,以防万一最初的延迟不足以防止丢弃事件。
总之
我会用:
bash -c 'xdotool sleep 0.125 type --clearmodifiers --delay 125 "$(date +%Y%m%d)"'
复制您的预期行为,但用于sleep
和 的值--delay
可能需要调整,具体取决于您的设置。
另一种可能的选择
如果您不介意破坏剪贴板,更好的方法可能是发送以下内容的默认快捷方式paste selection
:
bash -c 'printf "%s" "$(date +%Y%m%d)" | tee >(xsel -bi) | xsel -i; xdotool sleep 0.125 key --clearmodifiers shift+Insert'
这用于xsel
将所需的文本放入CLIPBOARD
和PRIMARY
选择中(因为ShiftInsert它使用的文本不一致)。然后它会合成按键序列来粘贴此选择。由于这仅需要两次合成按键,因此与其他方法相比,丢弃事件的可能性更小。
1来自xdotool(1)
:
发送事件注释
如果您尝试将按键输入发送到特定窗口,但它似乎不起作用,那么您的应用程序可能会忽略 xdotool 正在生成的事件。这是相当常见的。
将击键发送到特定窗口使用的 API 与简单地在活动窗口中键入不同。如果指定“xdotool type --window 12345 hello”,xdotool 将生成按键事件并将它们直接发送到窗口 12345。但是,X11 服务器将为以这种方式生成的所有事件设置一个特殊标志(请参阅 X11 中的 XEvent.xany.send_event手动的)。许多程序都会观察此标志并拒绝这些事件。
需要注意的是,对于按键和鼠标事件,我们仅在针对特定窗口时使用 XSendEvent。否则,我们使用 XTEST。
有些程序可以配置为接受事件,即使这些事件是由 xdotool 生成的。寻求您的应用程序文档以寻求帮助。
具体应用笔记(来自作者测试):
- Firefox 3 在没有焦点时似乎会忽略所有输入。
- 可以在使用 ctrl+leftclick 运行时配置 xterm,“允许 SendEvents”
- gnome-terminal 似乎默认接受生成的输入。
2如果我确切地了解了为什么会出现这种情况,我将重新审视这个答案并详细阐述这一点。