Estou tentando desenvolver um projeto pessoal para estudos e me deparei com o seguinte problema, envio um código para o “Terminal” executar e necessito que ele me retorne o HEX( ou id) da janela do aplicativo que foi aberto.
Process p;
Runtime.getRuntime().exec("_meuCodigoAqui");
O codigo “wmctrl -a” obtêm todas as informações das janelas abertas inclusive o HEX, eu poderia salvar o HEX existente e comparar qual é o novo HEX e salvar o mesmo na variavel, existe um meio mais “limpo e otimizado” pra eu só coletar o HEX direto do Processo criado no Runtime??
A classe Process, a partir do java versão 9, tem o método pid(), que retorna o id do processo.
FONTE: https://docs.oracle.com/javase/9/docs/api/java/lang/Process.html#pid--
Acabei me expressando mal na pergunta, ele realmente retorna o PID ( process id) mas eu precisaria do “window id”, até consigo fazer uma nova solicitação no terminal para procurar a janela que esse processo está utilizando(caso houver). Mas queria diminuir o acesso ao terminal de algum modo apenas para conhecimento. Acabei fazendo exatamente isso.
No linux posso utilzar o xdotool ou o xterm mas não queria ter que instalar um novo pacote.
Contornei o problema com a seguinte solução, um metodo para Executar os comandos e retornar as informações.
private List<String> ExecuteComandTerminal(String command) throws IOException{
String[] args = new String[] {"/bin/bash", "-c", command, "with", "args"};
Process proc = new ProcessBuilder(args).start();
BufferedReader stdInput = new BufferedReader(new
InputStreamReader(proc.getInputStream()));
String s = null;
List<String> result = new ArrayList<>();
while ((s = stdInput.readLine()) != null) {
result.add(s);
}
return result;
}
O metodo para chamar o método anterior e comparar as hex antes de abrir o app e depois.
private void OpenWindowSaveHex() throws IOException, InterruptedException{
List<String> hexAntes = new ArrayList<>();
List<String> hexDepois = new ArrayList<>();
hexAntes = ExecuteComandTerminal(pathGetAllHex);
ExecuteComandTerminal(tibiaPath);
hexDepois = ExecuteComandTerminal(pathGetAllHex);
hexDepois.removeAll(hexAntes);
for (int i = 0; i < hexDepois.size(); i++) {
System.out.println(hexDepois.get(i));
}
}
Acredito que é a solução, infelizmente me informaram em outro local que eu teria que instalar os pacotes e fazer a solicitação, para reaproveitar código eu fiz desta maneira.