繁体   English   中英

如何使用Java运行时执行程序将数据输入到外部GUI

[英]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');

上面的代码在起作用:

正在运行的awt.Robot代码的屏幕截图

如果新应用程序窗口的位置在每次启动时都没有改变,并且该工具不会部署到用户,则可能已经足够。 但是,如果每次启动都更改位置,那么挑战是要找到窗口位置,从那里添加相对输入元素的位置。 有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM