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


Автор: Aprol 27.1.2009, 12:19
http://forum.vingrad.ru/faq/topic-157976.html
по ссылке описывается как получить поток от батника, а обратного пути не описанно.
Чтобы передать нажатие клавиши запущенному батнику попробовал переделать пример, но не получается. помогите.
Код

import java.io.*;

public class Primer {
    public static void main(String[] args) {
        try {
            Process proc = Runtime.getRuntime().exec("D:/2.bat");
            Streamer out_stream = new Streamer(proc.getInputStream());
            Streamer2 stream=new Streamer2(proc.getOutputStream());
            
            out_stream.run();
            stream.run();
        } catch (IOException e) {
            e.printStackTrace();  
        }
    }
}
class Streamer extends Thread {
    private InputStream input;

    public Streamer(InputStream in) {
        input = in;
    }

    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String line = null;

            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}
class Streamer2 extends Thread {
    private OutputStream output;

    public Streamer2(OutputStream out) {
        output = out;
    }

    public void run() {
        try {
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output));
            
[size=8]               writer.newLine();
               writer.write("13");[/size]

        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}


сам батник простенький
Код

ver
pause
ver

Автор: ivg 27.1.2009, 13:26
Код

         ....
10:            out_stream.start();
11:            stream.start();
         ....
50:            writer.flush();
         ....

Автор: math64 27.1.2009, 13:31
Код

Process proc = Runtime.getRuntime().exec("D:/2.bat");
Writer writer = new OutputstreamWriter(proc.getOutputStream());
writer.write("\r\n");
writer.flush();

Автор: Aprol 27.1.2009, 14:02
Цитата(math64 @  27.1.2009,  13:31 Найти цитируемый пост)
writer.write("\r\n");

Что это за строка поясните.

Добавлено через 1 минуту и 46 секунд
Цитата(ivg @  27.1.2009,  13:26 Найти цитируемый пост)
10:            out_stream.start();
11:            stream.start();
         ....
50:            writer.flush();
         ....

к сожалению не работает

Автор: ivg 27.1.2009, 14:24
Цитата(Aprol @  27.1.2009,  16:02 Найти цитируемый пост)
к сожалению не работает 

А как не работает? Совсем или чуть-чуть? Я надеюсь вы поняли, что это исправления к вашему коду. К слову у меня работает. Попробую догадаться и предложить ещё одно:
Код

6:            Process proc = Runtime.getRuntime().exec("cmd.exe /C D:/2.bat");

Автор: math64 27.1.2009, 14:35
Можно так:
Код

Process proc = Runtime.getRuntime().exec("D:/2.bat");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
writer.newLine();
writer.flush();
writer.close();
reader.close();

"\r\n" - строка которую выведет newLine() в Windows, возможно достаточно будет передать "\r".
При необходимости можно создать потоки, как было сделано у тебя, с поправками ivg

Добавлено через 3 минуты и 44 секунды
Возможно, нужно писать "D:\\2.bat"

Автор: Aprol 28.1.2009, 09:45
Цитата(ivg @  27.1.2009,  14:24 Найти цитируемый пост)
Я надеюсь вы поняли, что это исправления к вашему коду

Конечно понял. Получаю поток только от батника, но отправить нажатие не  получается.
То есть у вас срабатывает такой батник и в консоле получаете две записи с версией винды?

Автор: Aprol 28.1.2009, 09:51
Извините, много проблем от невнимательности.
Код:
Код

           out_stream.run();
           stream.run();

не поменял на 
Код

           out_stream.start();
           stream.start();

Теперь запускается.
Другие примеры обязательно попробую тоже.

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