Gostaria de saber se alguém sabe como consigo saber se uma aplicação(ex:AcrobatReader) foi finalizada pelo usuário ?? Essa aplicação foi disparada pelo meu programa, mas ateh o momento naum consegui descobrir como saber em que exato momento o usuário irá fechar essa aplicação ? Alguém sabe me informar se é possível fazer isso ??
Se você fizer simplesmente assim:[code]public class Teste1 {
public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
Process processo = run.exec(“D:\Arquivos de programas\Adobe\Acrobat 6.0\Reader\AcroRd32.exe apresentacao_jdo.pdf”);
} catch(Exception e) {
e.printStackTrace();
}
}
}[/code]
O Acrobat Reader será chamado mas o programa fecha logo e vc não fica sabendo quando o usuário fechou o reader.
Mas se você colocar em um arquivo .bat um programinha seu que seja executado depois do reader e que envie uma mensagem por socket ao seu programa na hora em que ele executar então vc fixará sabendo quando o reader terminou pois o tal programinha só entra depois do reader.
Exemplos:
Arquivo testeexec.bat:
"D:\Arquivos de programas\Adobe\Acrobat 6.0\Reader\AcroRd32.exe" apresentacao_jdo.pdf
java seu_programinha
[code]public class Teste2 {
public static void main(String[] args) {
try {
Runtime run = Runtime.getRuntime();
Process processo = run.exec(“testeexec.bat”);
Isso é meio complicado, mesmo se você fizesse seu programa em C++ e usasse as APIs do Windows ia apanhar um pouco. Em Java não sei lhe dizer (sem ter de usar JNI, é claro!)
P.S. Não tinha visto a solução do Luca. Legal, vou tentar
Lucas a solução parece ser boa, mas eh que este código eh executado em um Applet assinado digitalmente, com todas as permissões para escrever e ler na máquina do usuário, e fazer o “download” de um .bat para a máquina do cara pra fazer isso seria um pouco estranho. Outra gravidade, eh que teríamos que realizar um .sh para o caso de este applet estar executando sobre linux…
Será que naum tem outra possibilidade ??
A execução do reader é feito em um processo separado. Tudo que você fizer dentro do seu programa Java será feito em paralelo com o processo do reader. O único meio é vc colocar a monitoração fora da sua applet.
Ou então partir para o que disse o thingol e ficar monitorando todos os processos em execução na máquina com ps no Linux, pslist do sysinternals no Windows ou usando a API do Windows em C chamado com JNI. Para o Windows veja http://www.sysinternals.com/ntw2k/freeware/procexp.shtml
O Process, por sua vez, tem uns metodos muito bacanas, como por exemplo waitFor(), que faz a thread atual parar ate que a aplicacao seja finalizada. Pra evitar de ficar com a app totalmente morta enquanto o acrobat executa, voce pode iniciar uma thread, abrir o acrobat, dar um waitFor(), e logo na sequencia sinalizar a sua aplicacao com um notify() ou usando uma fila de eventos, e pronto
Como de costume, se você estiver usando uma applet, não se esquecer de:
Assinar a applet
Ver se você pode usar o plugin da Sun, ou se você tem de usar o plugin da Microsoft
chamar os métodos de autorização, se você tiver de chamar os métodos a partir de init(), start(), stop() - no MSJVM é algo como PolicyEngine.assertPermission(PermissionID.SYSTEM), e no Sun Plugin, algo como System.setSecurityManager(new MySecurityManager()), onde MySecurityManager é uma classe como:
import java.security.Permission;
class MySecurityManager extends SecurityManager {
public void checkPermission(Permission perm, Object context) {
}
public void checkPermission(Permission perm) {
}
}
(só assinar o applet não adianta)
ver se você pode usar a API no plugin da Microsoft (por sorte, waitFor existe no JDK antigo …)
Olá Pessoal…
Agradeço muito pelo empenho de todos por estarem enviando suas sugestões…
Porém tentei utilizar o método waitFor() da classe Process e ele não faz oq deveria fazer, ou seja, travar a aplicação ateh que, por exemplo o Acrobat seja fechado pelo usuário…
Um dos exemplos que estou testando eh esse:
Process process = Runtime.getRuntime().exec(“nautilus /home/jeferson/docs/jmx.pdf”);
process.waitFor();
System.out.println(“Aplicativo Fechado”);
Nesse exemplo eu uso o nautilus (Gerenciador de aplicativos padrão do GNOME) para disparar o programa padrão do sistema operacional asociado ao tipo de arquivo que se deseja abrir. No meu caso estou utilizando o fedora Core 2.
Mesmo colocando o waitFor() depois de disparar o comando meu programa logo após imprime a mensagem no console indicando que o processo jah terminou, porém o aplicativo(no meu caso o AcrobatReader) ainda continua aberto…
Puxa, e se você tentar chamar diretamente o executável do Acrobat (no Linux não sei onde ele fica instalado - estou sem acesso ao Linux agora), em vez de dispará-lo com o Nautilus?
Dê uma olhada com ps -ef, é bem capaz da instância do Nautilus que foi usada para iniciar o Acrobat (é o Acrobat mesmo, ou é o xpdf?) tenha já sido destruída, quando o Acrobat entrar no ar. waitFor só tem a responsabilidade de esperar pelo nautilus, não pelo Adobe Acrobat Reader, do jeito que você fez.
Thingol, realizei o teste fazendo a chamada diretamente ao AcrobatReader, porém, acontece o mesmo do que quando eu estava utilizando o nautilus…
Ficou assim :
Process process = Runtime.getRuntime().exec("/opt/Acrobat5/bin/acroread /home/jeferson/docs/jmx.pdf");
process.waitFor();
System.out.println(“Aplicativo Fechado”);
Jah pesquisei em diversas fontes, mas ateh agora naum encontrei nenhuma coisa que seja possível resolver este problema…
Conto com a comunidade para resolver esta solução e caso, alguém de nós consiga resolver isso, peço que postem a solução aqui no fórum para compartilharmos o conhecimento com todos aqueles que buscam aprender java…