簡體   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