【问题标题】:Java Process API - send tab key press event to interactive shell programJava Process API - 将 Tab 键按下事件发送到交互式 shell 程序
【发布时间】:2017-09-24 22:12:20
【问题描述】:

我有一个交互式命令行程序,当按下制表键时,它具有制表完成功能(完成命令或列出可能的选项)。

我正在编写另一个 Java 程序,它将作为带有 ProcessBuilder 的子进程启动命令行程序。

我可以使用Process.getInputStream()Process.getOutputStream() 将输入传递给进程。

现在,我想在子进程中触发自动完成。当我打印税号 '\t' 时,它被视为常规制表符,而不是触发制表符自动完成。

有没有办法将按键或等效事件从 Java 进程发送到子进程?

【问题讨论】:

  • 嘿杰克,你看过这个stackoverflow.com/questions/3537706/…
  • 这似乎不同。在这种情况下,如果我写字符 '\t' 然后子进程读取单个制表符。当我发送“\\t”(实际上是两个字符)时,子进程读取两个字符。但我想要的是,发送按键事件
  • 当程序认为它正在以非交互方式使用时,通常会禁用完成等功能;特别是对于 bash (4.1),仅当 shell “在没有非选项参数且没有 -c 选项的情况下启动时才启用 readline [and] 标准输入和错误都连接到终端(由 isatty(3) 确定) , 或 ... 以 -i 选项开头”。默认情况下,Java ProcessBuilderRuntime.exec 始终使用管道作为孩子的 stdin/out/err,并且管道从 isatty 返回 false。对于其他 shell 或程序,请查看其文档。

标签: java java-io


【解决方案1】:

您可以尝试使用机器人

Robot robot = new Robot();
robot.mouseMove(x, y); //Select the console window at x,y
robot.keyPress(KeyEvent.VK_TAB); //Send tab key  

或者也运行特定于操作系统的命令,例如 xdotool for Unix using X11

xdotool windowactivate id &&
xdotool key Tab &&

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2011-12-18
    • 1970-01-01
    • 2011-11-27
    相关资源
    最近更新 更多