【问题标题】:How to emulate Ctrl+I pressed on a terminal process如何模拟在终端进程上按下的 Ctrl+I
【发布时间】:2016-02-26 22:34:44
【问题描述】:

我有一个进程,我用 Java 启动了一个(非 Java)CLI 进程,我想以编程方式向它发送 Ctrl+I 组合键。

有可能吗?

【问题讨论】:

  • 是的。有可能的。 java 键绑定应该可以解决问题。
  • @andrewdleach 也许我遗漏了一些东西,但我不明白这将如何帮助我以编程方式将 Ctrl+I 发送到远程 CLI 进程。
  • 对不起,在控制台中ctrl+I是做什么的?它是否映射到中断?
  • @ChiefTwoPencils 我不这么认为。它只是一个控制符号。
  • 如果外部进程在其标准输入中查找 Ctrl-I 字符(顺便说一下,与 Tab 相同),GreenGiant 的解决方案将起作用。由于这不起作用,该过程显然正在其控制台(tty)上寻找按键,这是其他程序根本无法访问的。您需要编写本机代码来创建虚拟 tty 并让进程使用它; JNI 是您允许 Java 调用本机代码作为 Java 程序的一部分的方式。

标签: java terminal


【解决方案1】:

如果外部进程在其标准输入中查找 Ctrl-I 字符(顺便说一下,与 Tab 相同),GreenGiant 的解决方案将起作用。由于这不起作用,该过程显然正在其控制台(tty)上寻找按键,这是其他程序根本无法访问的。您需要编写本机代码来创建虚拟 tty 并让进程使用它。 JNI 是您允许 Java 作为 Java 程序的一部分调用本机代码的方式。

【讨论】:

    【解决方案2】:

    如果不使用 GUI,您将无法在控制台窗口中发送 KeyListener 事件。

    查看以下内容了解更多详情:

    Key Bindings in Command Prompt with Java?

    Java key listener in Commandline

    【讨论】:

    • 对不起,这不是我要问的。我需要以编程方式将 Ctrl+I 从 Java 发送到不同的 CLI 进程。
    【解决方案3】:

    如果您使用ProcessBuilder 启动其他程序,那么您可以通过将适当的字节写入进程的输入流来发送控制序列。

    我不确定你需要发送的实际字节序列是什么,但是based on what I'm finding,好像 Ctrl+A 是 1,Ctrl+B 是 2,等等。

    ProcessBuilder pb = new ProcessBuilder( "..." );
    Process process = pb.start();
    OutputStream stream = process.getOutputStream();
    stream.write( 'I' - 'A' + 1 ); // send Ctrl+I
    stream.flush();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-14
      • 2021-11-02
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2012-03-12
      相关资源
      最近更新 更多