Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Простая Java программа поверх сложной.


Автор: Artemij 25.7.2008, 11:39
Привет!

Насколько реально реализовать программу на Java, которая собирает информацию и автоматически заполняет соответствующие поля в сторонней программе? Некий простой интерфейс с подсказками поверх более сложного. Сторонняя программа не имеет API.

Примерный алгоритм:
1) Пользователь заполняет все поля в простом интерфейсе.
2) Информация записывается в TXT файл и одновременно копируется в Windows буфер.
3) Информация из буфера копируется в соответствующие поля в сторонней программе.

Желательно свести к минимуму участие пользователя в данном процессе, естественно кроме заполнения полей информацией.

Подскажите примерно план реализации?

СПАСИБО!

Автор: Orange 25.7.2008, 12:18
Я так понимаю сторонняя программа написана не на Java?
Что ей мешает читать информацию из файла?

Автор: Artemij 25.7.2008, 12:27
Цитата(Orange @ 25.7.2008,  12:18)
Я так понимаю сторонняя программа написана не на Java?
Что ей мешает читать информацию из файла?

Да, сторонняя программа написана не на Javaне имеет API и не читает информацию из файлов. Более того является клиентом, который собирает информацию и отправляет её на сервер в БД. Речь идёт о Windows Only.

Например, Skype. Допустим мне не нравиться интерфейс ввода сообщения, и я хочу написать свой на Java.

Автор: Orange 25.7.2008, 13:09
Хм, даже не знаю что тут предложить.

Конкретно по вопросам:

2) Информация записывается в TXT файл и одновременно копируется в Windows буфер.
Код

  public void setBuffer( String aString ){
    StringSelection stringSelection = new StringSelection( aString );
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents( stringSelection, this );
  }

public String getBuffer() {
    String result = "";
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable contents = clipboard.getContents(null);
    boolean hasTransferableText =
      (contents != null) &&
      contents.isDataFlavorSupported(DataFlavor.stringFlavor)
    ;
    if ( hasTransferableText ) {
      try {
        result = (String)contents.getTransferData(DataFlavor.stringFlavor);
      }
      catch (UnsupportedFlavorException ex){
        System.out.println(ex);
        ex.printStackTrace();
      }
      catch (IOException ex) {
        System.out.println(ex);
        ex.printStackTrace();
      }
    }
    return result;
  }


3) Информация из буфера копируется в соответствующие поля в сторонней программе.
JNI

Автор: AntonSaburov 25.7.2008, 14:15
Цитата(Artemij @  25.7.2008,  11:39 Найти цитируемый пост)
Примерный алгоритм:
1) Пользователь заполняет все поля в простом интерфейсе.
2) Информация записывается в TXT файл и одновременно копируется в Windows буфер.
3) Информация из буфера копируется в соответствующие поля в сторонней программе.

Программа, которая самостоятельно гадит буфер обмена должна быть уничтожена. За такие программы увольнять надо сразу smile
Я не шучу - это крайне неудачное решение. Может лучше тогда посылать Windows-сообщения нужным контролам в окошке программы ?

Автор: Orange 25.7.2008, 14:21
Цитата

Программа, которая самостоятельно гадит буфер обмена должна быть уничтожена. За такие программы увольнять надо сразу.

А можно поподробнее об этом? Что тут такого сильно криминального?

Автор: AntonSaburov 25.7.2008, 14:27
Цитата(Orange @  25.7.2008,  14:21 Найти цитируемый пост)
А можно поподробнее об этом? Что тут такого сильно криминального?

Пользователь запомнил какие-то данные  в буфере обмена - надо ему было. Потом решил запустить такую славную программу, нажал на кнопочку. У него все хорошо. А теперь он хочет вставить свои данные (которые, как он наивно полагает, все еще в буфере) - и получает полную фигню. Думаешь кто-то захочет пользоваться такой программой ?
Это крайне неудобный и неюзабельный подход. Я еще лет 15 назад в этом убедился - пользователь просто в шоке бывает.

Автор: powerOn 25.7.2008, 15:05
Думаю что если программа делает копирование не в тихоря, на например по нажатию кнопки пользователем, то решение нормальное. Так же как и Ctrl+C нажать.
Т.е. заполнил поля нажал на кнопку, данные в буфер ушли, переключился на другую прогу, вставил данные из буфера. Все довольны, все под контролем пользователя. Или я что то упустил? smile

Автор: AntonSaburov 25.7.2008, 15:46
Ну разве что под контролем пользователя. Хотя я не люблю такое.

Автор: w1nd 25.7.2008, 16:52
Цитата(AntonSaburov @  25.7.2008,  14:15 Найти цитируемый пост)
Может лучше тогда посылать Windows-сообщения нужным контролам в окошке программы?

СтОит делать именно так smile 

Автор: Artemij 25.7.2008, 22:57
Цитата(Orange @ 25.7.2008,  13:09)
Хм, даже не знаю что тут предложить.

Конкретно по вопросам:

2) Информация записывается в TXT файл и одновременно копируется в Windows буфер.
Код

  public void setBuffer( String aString ){
    StringSelection stringSelection = new StringSelection( aString );
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    clipboard.setContents( stringSelection, this );
  }

public String getBuffer() {
    String result = "";
    Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
    Transferable contents = clipboard.getContents(null);
    boolean hasTransferableText =
      (contents != null) &&
      contents.isDataFlavorSupported(DataFlavor.stringFlavor)
    ;
    if ( hasTransferableText ) {
      try {
        result = (String)contents.getTransferData(DataFlavor.stringFlavor);
      }
      catch (UnsupportedFlavorException ex){
        System.out.println(ex);
        ex.printStackTrace();
      }
      catch (IOException ex) {
        System.out.println(ex);
        ex.printStackTrace();
      }
    }
    return result;
  }


3) Информация из буфера копируется в соответствующие поля в сторонней программе.
JNI

Спасибо за конкретное предложение!

Автор: Artemij 25.7.2008, 23:13
Цитата(AntonSaburov @ 25.7.2008,  14:15)
Может лучше тогда посылать Windows-сообщения нужным контролам в окошке программы ?

А можно подробнее?

Примерный сценарий Java программы:

1) Пользователь заполняет все данные в простом интерфейсе ( Java программа ).
2) Данные проверяются, и, если нет ошибок, записываются в TXT файл и копируются в буфер.
3) Пользователь переключается ( открывает окно ) в стороннюю программу и нажимает Ctrl - V, например.
4) Информация из буфера ( или из TXT файла ) копируется в соответствующие поля сторонней программы.

Все рады.

Для меня сейчас самый БОЛЬШОЙ вопрос, как получить контроль над интерфейсом сторонней программы из вне (из Java программы)? Подскажите подробней как называется Java framework/package и где можно почитать на тему.

Почитал о JNI. Не очень понял,то ли это что мне надо или нет.  smile 

Ведь всё сходить к переключению между input field с помощью tab/enter/up/down/left/right. Тоесть полная имитация навигации по стороннему приложению пользователем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)