在 c++ 中模拟输入并在 JAVA 中读取它?
Simulate input in c++ and read it in JAVA?
我在这里遇到了一个问题,我想你们可以帮助/指出我适当的文档。
但首先,上下文:
我正在研究这个 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 中读取它们。
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 独立读取-修改-写入顺序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何从文本文件中读取值和数组
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 一种在C++中读取TXT配置文件的简单方法