使用的快捷键不是问题

使用的快捷键不是问题

自从 =~ 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+ tSuper+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将所需的文本放入CLIPBOARDPRIMARY选择中(因为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如果我确切地了解了为什么会出现这种情况,我将重新审视这个答案并详细阐述这一点。

相关内容