Как вводить данные во внешний GUI, используя Java Exec Runtime - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь написать код Java для доступа и использования программного обеспечения DullRazor .

Пожалуйста, обратитесь к этому образу приложения DullRazor:

DuulRazor

У меня была идея создать исполняющую программу Java, которая могла бы перебирать все образы, которые мне нужно обработать (программное обеспечение допускает только один образ за раз), и выполнить необходимые шаги, необходимые дляDullRazor программное обеспечение, чтобы успешно изменить изображение для каждого изображения, которое я имею.

Программное обеспечение DullRazor работает следующим образом:

- Исходный файл: требует изменения пути к изображению (в моем случае jpg), например, c: // Isic-Images // image0000.jpg.

- целевой файл: требуется местоположение для нового изображения с новым именем изображения, например c: //finalLocation//newImage.jpg

-Start: запустить программу после предоставленияввод в правильном формате, как описано выше.

Мое мышление перебирает все мои изображения, создает новые и увеличивает имя (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");
}

}

Я только что тестировалЯ немного с приведенным выше кодом, но я не уверен, как поступить.

Скажите, есть ли что-то, что требует уточнения?

Любая помощь очень ценится, спасибо.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Использование робота отлично работает для ввода в целевые поля и нажатия кнопки «Пуск / Очистка» в приложении.

Для того, чтобы найти позиции приложения в x & y, я использовал exec времени выполнения, чтобы открыть dullrazorи затем сделайте снимок экрана с приложением, где щелчки мыши показывают координаты x и y текущего щелчка.Ниже приведен код для поиска x & y, который я нашел в этом Stackoverflow thread :

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 за отличный ответ.

0 голосов
/ 01 января 2019

Вы можете использовать класс 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');

Приведенный выше код в действии:

Screencapture of the awt.Robot code in action

Если положение нового окна приложения не меняется при каждом запускеи инструмент не будет развернут для пользователей, этого может быть достаточно.Однако, если он меняет положение при каждом запуске, задача состоит в том, чтобы найти положение окна, чтобы добавить оттуда относительные положения элемента ввода.Существуют специфичные для Windows (платформы) подходы, облегчающие работу Win32 API через JNA, хотя я не знаком с ним и не доступен ли он в текущих версиях Microsoft Windows.

См. Эти связанные вопросы по определению других позиций окон.:

...