![](/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.