![](/img/trans.png)
[英]Exit code 1 while calling an external process using java Runtime exec
[英]How to input data into external GUI using Java runtime exec
我正在尝试编写Java代码来访问和使用DullRazor软件。
请参考DullRazor应用程序的以下图像:
我有一个想法,创建一个Java运行时程序,该程序可以遍历我需要处理的所有图像(该软件一次只允许一张图像),并完成DullRazor软件成功为每个图像修改一个图像所需的必要步骤。有。
DullRazor软件的工作方式如下:
-源文件:需要更改图像的路径(在我的情况下为jpg),即c://Isic-Images//image0000.jpg。
-目标文件:需要使用新图像名称(即c://finalLocation//newImage.jpg)的新图像的位置
-开始:按上述正确的格式输入后,运行程序。
我的想法是遍历所有图像,创建新图像并增加名称(img00,img001等)。
我从未在Java中尝试过这种方法,并且在访问软件的输入字段以及应用程序的“开始”按钮时遇到了一些麻烦。
下面的代码只是打开应用程序的非常基本的代码,但是我不确定如何访问DullRazor应用程序中的各个项目以及如何在上述字段中输入字符串(同样,请参考DullRazor图片)。
private String trainingPath = "C:\\Users\\user\\AppData\\Local\\Temp\\ISIC-Images\\Training\\0";
private String finalPath = "C:\\Users\\user\\finalLocation\\";
public static void main(String[] args) {
try {
Runtime runTime = Runtime.getRuntime();
Process process = runTime.exec("C:\\Users\\user\\Desktop\\dullrazor.exe");
System.out.println("Opening DullRazor");
OutputStream output = process.getOutputStream();
InputStream input = process.getInputStream();
Thread.sleep(2000);
process.destroy();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException s) {
s.printStackTrace();
} finally {
System.out.println("Closing Dullrazor");
}
}
我刚刚在上面的代码中进行了一些测试,但是不确定如何继续。
告诉我是否需要澄清。
非常感谢任何帮助,谢谢。
您可以使用Java的java.awt.Robot
类来控制屏幕上的鼠标和键盘。
这是一个简单的示例,在两个输入字段中输入“ test1”和“ test2”:
Robot r = new Robot();
r.mouseMove(22, 125);
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
r.keyPress('T');
r.keyRelease('T');
r.keyPress('E');
r.keyRelease('E');
r.keyPress('S');
r.keyRelease('S');
r.keyPress('T');
r.keyRelease('T');
r.keyPress('1');
r.keyRelease('1');
r.mouseMove(200, 125);
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
r.keyPress('T');
r.keyRelease('T');
r.keyPress('E');
r.keyRelease('E');
r.keyPress('S');
r.keyRelease('S');
r.keyPress('T');
r.keyRelease('T');
r.keyPress('2');
r.keyRelease('2');
上面的代码在起作用:
如果新应用程序窗口的位置在每次启动时都没有改变,并且该工具不会部署到用户,则可能已经足够。 但是,如果每次启动都更改位置,那么挑战是要找到窗口位置,从那里添加相对输入元素的位置。 有Windows(平台)特定的方法可通过JNA促进Win32 API,尽管我并不熟悉它,以及它是否在当前的Microsoft Windows版本中仍然可用。
请参阅以下有关确定其他窗口位置的问题:
为了输入目标字段并单击应用程序上的“开始/清除”按钮,使用机械手非常有效。
为了找到应用程序的x和y位置,我使用runtime exec打开dullrazor,然后使用应用程序向上截取屏幕截图,鼠标单击可以显示当前单击的x和y位置。 下面是在这个Stackoverflow 线程中找到的x和y的代码:
Robot robot = new Robot();
final Dimension screenSize = Toolkit.getDefaultToolkit().
getScreenSize();
final BufferedImage screen = robot.createScreenCapture(
new Rectangle(screenSize));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JLabel screenLabel = new JLabel(new ImageIcon(screen));
JScrollPane screenScroll = new JScrollPane(screenLabel);
screenScroll.setPreferredSize(new Dimension(
(int)(screenSize.getWidth()/2),
(int)(screenSize.getHeight()/2)));
final Point pointOfInterest = new Point();
JPanel panel = new JPanel(new BorderLayout());
panel.add(screenScroll, BorderLayout.CENTER);
final JLabel pointLabel = new JLabel(
"Click on any point in the screen shot!");
panel.add(pointLabel, BorderLayout.SOUTH);
screenLabel.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent me) {
pointOfInterest.setLocation(me.getPoint());
pointLabel.setText(
"Point: " +
pointOfInterest.getX() +
"x" +
pointOfInterest.getY());
}
});
JOptionPane.showMessageDialog(null, panel);
System.out.println("Point of interest: " + pointOfInterest);
}
});
谢谢try-catch-finally一个很好的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.