在 c++ 中模拟输入并在 JAVA 中读取它?

Simulate input in c++ and read it in JAVA?

本文关键字:读取 c++ 模拟输入 JAVA      更新时间:2023-10-16

我在这里遇到了一个问题,我想你们可以帮助/指出我适当的文档。

但首先,上下文:

我正在研究这个 c++ 脚本,它可以调用和运行带有参数的不同 java 可运行对象。但我是一个完全的 c++ 菜鸟,在一般编码方面。几周前开始Java。

此 C++ 脚本的目的(除其他事项外(是拦截输入并模拟其他输入,然后这些输入将由已经运行的 Java 线程读取。目标是让java能够运行这样的循环:

public class CalledByCpp extends JFrame{
protected static KeyList listener = new KeyList(); //custom KeyListener
//frame constructor goes here
public void main(String[] args){
//initialization of bunch of things
this.addKeyListener(listener);
while(true){
requestFocus();
}
}
protected static class KeyList(){
//Handling of key pressed
}

这听起来可能吗?还是有更简单的方法?我在 c++ 中寻找的事件创建方法是什么?

旁注:cpp 和 java 都可以在 Linux 桌面 (debian( 上运行,无需附加任何屏幕,因此我认为 java 框架在 requestFocus(( 上循环是安全的。右?

我的另一个线索是建立一个驱动程序,但我不知道有什么区别,以及如何做到这一点,或者即使这是一个值得投入时间和精力的潜在客户,当这个 cpp 本身可以充当驱动程序时。

多谢!

您可能希望通过 standard in 将输入提供给 Java。要侦听的"事件"可能只是从标准输入中读取一行,也可能是多行。您只需要有某种方法来检测何时停止阅读并执行某些操作。由于 Java 程序中的所有线程都将接收此数据,因此您还需要某种方法来检测哪个线程打算使用该数据。我会先启动您的C++程序,然后从您的C++程序中启动 Java,设置以便您可以从 C++ 程序将数据写入 Java 进程的标准。在 UNIX 环境中,有一种标准方法可以做到这一点。在C++程序中,运行类似以下内容(您需要包含标头unistd.h(:

int fd[2];
// For sharing data with Java process
pipe(fd);
pid_t id = fork();
if (id < 0) {// system error
printf("Failed to fork process");
exit(1);
}
// parent process
else if (id > 0) {// id of child process (Java)
// optional: writes to standard out go to Java process
// can also use write(fd[1], <data>, <length>)
dup2(1, fd[1]);
close(fd[0]);
// do stuff and write to Java process as needed
// signal end of data to Java process
close(fd[1]);
// wait for Java process to exit and clean it up
if (wait(NULL) < 0) {// system error
exit(2);
}
}
else {// child (Java) process, id = 0
// Read stdin from parent (C++) process
dup2(0, fd[0]);
close(fd[1]);
char* path = "/path/to/java";
// Arguments to java. Always end with NULL
char* argv[] = {"Java_arg1", "Java_arg2", NULL}
// Run java
if (execv(path, argv) < 0) {// system error
printf("Failed to execute java command");
exit(1);
}
}

所以我有时间尝试一个快速代码。使用 Xdotool,您可以在 github 或 apt-get install xdotool 上找到

//in the loop deciding which input to simulate
system("xdotool key T");

这将模拟一键按下 T.无需弹出控制台,脚本可以在后台运行并轻松生成输入。它们是实际的系统输入,所以我能够在 java 中读取它们。