Я рекомендую автоматизацию через GUI только в крайнем случае, если у вас действительно нет другой альтернативы.
Если есть API, который предоставляет ваше приложение, я бы попробовал использовать это. Например, если графический интерфейс реализован в одной DLL, а логика - в другой, вы можете использовать JNA для загрузки логики DLL вашего приложения и вызова функций приложения непосредственно из Java. Еще лучше было бы, если бы ваше приложение предоставляло интерфейс COM / OLE - есть много Java <> COM-мостов, которые позволят вам вызывать этот интерфейс напрямую, например. Jacob .
Если у вас действительно нет выбора, кроме как автоматизировать через графический интерфейс, то вот как это сделать:
- Используйте JNA для доступа к API оболочки Windows. Затем вы можете использовать ShellExecute , чтобы запустить упакованное приложение. В частности, передача SW_HIDE в качестве оконного режима должна помочь гарантировать, что приложение не появится.
- Используйте JNA для доступа к Windows API FindWindow , чтобы найти окно вашего приложения. Вы также можете сделать его невидимым с помощью API ShowWindow , на случай, если шаг 1 не сработал (не все приложения написаны для использования параметра nCmdShow.)
- Теперь вы можете отправлять сообщения в окно приложения, используя PostMessage . Вы можете отправлять нажатия клавиш и события мыши, используя сообщения Windows. Например. См. WM_KEYUP , WM_LBUTTONDOWN .
Поскольку окно приложения в оболочке стало невидимым, вам не нужно «блокировать» это приложение. Пользователь просто не может получить доступ к его графическому интерфейсу. Но вы все равно можете программно отправлять входные данные.