Возможно ли захватить всплывающее окно с сообщением Windows изнутри Java-программы? - PullRequest
2 голосов
/ 02 сентября 2010

У меня есть процесс Java, который выполняется на сервере Windows, где мне нужно запустить exe командной строки.Я использую

Process p = Runtime.getRuntime().exec(command);
OutputStream stdin = p.getOutputStream();
InputStreamstderr = p.getErrorStream();
InputStream stdout = p.getInputStream();

для запуска процесса и захвата стандартных входных / выходных потоков.Проблема, с которой я столкнулся, заключается в том, что один из исполняемых файлов, который мне нужно запустить, выдаст всплывающее окно с сообщением, для которого нужно нажать «ОК», прежде чем оно завершится с ошибкой.
Моя Java-программа работает в фоновом режиметаким образом, у него нет окна для всплывающего окна сообщения, то есть когда exe-ошибки Java-программа будет зависать, пока кто-то не заметит это и не убьет его в диспетчере задач.

Есть ли способ уловить или обнаружить эти всплывающие окна из Java?

Ответы [ 4 ]

1 голос
/ 02 сентября 2010

Тебе может повезти. Вы можете использовать JNA для вызова EnumerateWindows или FindWindow API Win32. Затем найдите кнопку с помощью FindWindowEx .

Затем «кликните» по нему, позвонив PostMessage и отправив BM_CLICK

Возможно, вам нужен отдельный поток-наблюдатель, который делает все это, так как ваша программа ожидает завершения или продолжения процесса.

Извините, мой ответ очень грубый. Ужин имеет приоритет.

0 голосов
/ 03 сентября 2010

Не элегантное, но простое решение - тайм-аут.

0 голосов
/ 02 сентября 2010

Нет, не напрямую, насколько я могу судить.Тем не менее, вы, вероятно, можете сделать некоторую форму асинхронного уведомления.Например, вы можете разместить конкретное сообщение приложения в теме в очереди JSM, на которую может подписаться ваше приложение.Если у вас нет возможности идти по маршруту JMS, вы можете использовать триггеры на основе уведомлений о файлах.Вы можете заставить другое приложение создать фиктивный файл в общем каталоге, и ваше приложение может следить за этим каталогом.

Суть в том, что я не думаю, что вы можете захватить всплывающее окно из другого процесса внутри вашего процесса.Таким образом, вам нужно будет сделать некоторую форму внешней / асинхронной обработки, чтобы захватить ее.

0 голосов
/ 02 сентября 2010

Нет. Это просто запущенный процесс.

Создание всего, что создает GUI или любой другой метод управления, которым нельзя управлять через stdin / out, не имеет большого смысла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...