【问题标题】:Send keystrokes to non-active GUI application without occupying the keyboard在不占用键盘的情况下将击键发送到非活动的 GUI 应用程序
【发布时间】:2019-09-26 05:51:59
【问题描述】:

正如标题所解释的,我正在尝试使用终端将命令作为击键发送到最小化的 GUI 应用程序。

Stack 上有很多类似的问题,有一些很好的答案,但我看到的解决方案主要存在三个问题:大多数解决方案都需要自动化应用程序成为活跃的解决方案。或者,在脚本/进程运行时,我通常不能使用我的键盘。或者更糟糕的是,该解决方案仅适用于 Windows 操作系统。

我需要这个人 2 个月前问的问题:Send keystrokes to a specific window (in background), but do something else in the meantime 但我想在 Linux 上使用它。 如果有帮助,我正在使用 Kubuntu 18.10。

xdotool 已关闭,但我无法将命令发送到特定窗口或 PID。它还使用“我的键盘”,所以我不能,例如,在 xdotool 运行时在线写一篇文章/代码/浏览。 Pexpect 也有这最后一个问题。

AutoHotKey 看起来可以工作,但它只适用于 Windows,我试图不使用 Wine。与 pywin32 相同。

键盘 (https://github.com/boppreh/keyboard) 看起来不错,但它无法向特定应用程序发送命令。与 PyAutoGUI 相同。

我选择 Python 标记是因为我看到的大多数解决方案都使用 Python,但我对任何语言都持开放态度。

【问题讨论】:

  • 您打算如何发送击键?您是否考虑过创建自己的进程来运行并在请求时调用xdotool key --window windowId <keystroke>?这样,xdotool 就不会占用您的键盘,因为它仅在您想要发送击键时运行。
  • xdotool key --window windowId <keystroke> 并没有解决这个问题的问题,问的人想在脚本运行的同时在线写一篇文章/代码/浏览,xdotool 需要专注于将接收击键。在 Windows 上有“user32.dll”可以做到这一点,但这个人正在为 Linux 搜索一些东西。
  • 如果目标应用程序可以在单独的 X 会话中运行,那么它可以始终处于焦点状态,如果从同一个 X 会话中运行,xdotool 也可以工作
  • @Tim 你能详细说明它是如何工作的,以及如何做到这一点吗?

标签: python linux shell user-interface automation


【解决方案1】:

使用嵌套的 X 服务器输入击键而不改变焦点或键盘抓取。 概念证明:

Xephyr -resizeable :13
export DISPLAY=:13
xterm
xdotool type rhabarber

Xephyr 嵌套 X 服务器已启动,并将侦听本地 X 套接字 13(而 :0 通常标识当前正在运行的 X 服务器,但当同时运行多个会话时,它可能会更高)。 然后我们将 DISPLAY 环境变量设置为 :13,所以我们启动的任何 X 应用程序都将连接到 Xephyr; xterm 是我们的目标应用程序。使用xdotool 或任何其他我们可以发送击键的工具。

由于通过$DISPLAY 识别目标X 服务器,因此也可以启动应用程序或输入从其他地方触发的事件。如果需要,您还可以在 Xephyr 中运行轻量级窗口管理器,例如将应用程序“最大化”,使其填满整个 Xephyr 窗口。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2013-02-03
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 2010-11-16
    相关资源
    最近更新 更多