Como usar a classe Robot (java.awt.Robot)
No episódio de hoje, mostrarei com detalhes todos os metodos da classe Robot e funcionalidades bem “úteis”:
- Programa que simula um funcionário;
- Programa para vigiar irmãzinha e namorada (haha).
A classe Robot é usada para manipular eventos nos periféricos do sistema operacional nativo. Pode ser usada para fazer testes em aplicações entre outras funcionalidades.
Construtores:
A classe Robot te possibilita informar qual o dispositivo de saída vai ser usado e isso vai ser indicado pelo construtor.
Robot() throws AWTException
O construtor sem parâmetro usa o vídeo como dispositivo de saída.
Robot(java.awt.GraphicsDevice) throws AWTException
Usando esse construtor você vai poder passar por paramêtro o dispositivo de saída.
Para saber como obter um GraphicsDevice visite: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/class-use/GraphicsDevice.html
Exemplos:
Construtor sem parâmetro:
Robot robot = null; try { robot = new Robot(); } catch (AWTException e) { System.out.println("Erro ao criar o Robô"); }
Construtor com parâmetro:
Robot robot = null; try { // Essa chamada é o que o construtor sem parâmetros faz // internamente. robot = new Robot(GraphicsEnvironment.getLocalGraphicsEnvironment() .getDefaultScreenDevice()); } catch (AWTException e) { System.out.println("Erro ao criar o Robô"); }
Métodos:
Manipulando o teclado
void keyPress(int keycode)
Pressiona a tecla passada por parâmetro.
void keyRelease(int keycode)
Solta a tecla passada por parâmetro.
Exemplos de keyPress e keyRelease:
// Escrevendo VANIO robot.keyPress(KeyEvent.VK_V); robot.keyRelease(KeyEvent.VK_V); robot.keyPress(KeyEvent.VK_A); robot.keyRelease(KeyEvent.VK_A); robot.keyPress(KeyEvent.VK_N); robot.keyRelease(KeyEvent.VK_N); robot.keyPress(KeyEvent.VK_I); robot.keyRelease(KeyEvent.VK_I); robot.keyPress(KeyEvent.VK_O); robot.keyRelease(KeyEvent.VK_O); // Copiando (Ctrl + C) robot.keyPress(KeyEvent.VK_CONTROL); robot.keyPress(KeyEvent.VK_C); robot.keyRelease(KeyEvent.VK_C); robot.keyRelease(KeyEvent.VK_CONTROL);
Perceba que eu utilizo a classe java.awt.event.KeyEvent para obter as teclas, assim fica bem mais facil que decorar cada tecla.
Atenção: lembre-se de sempre soltar uma tecla depois de pressiona-la.
Manipulando o mouse
Botões:
InputEvent.BUTTON1_MASK, botão esquerdo.
InputEvent.BUTTON2_MASK, botão direito.
InputEvent.BUTTON3_MASK, botão central.
void mouseMove(int x, int y)
Move o mouse até a posição x,y. Lembrando que x é horizontal e y vertical.
Exemplo:
// Movendo o mouse até o canto superior esquerdo da tela robot.mouseMove(0, 0);
void mousePress(int button)
Preciona o botão passado por parâmetro. Lembre-se de soltar o botão do mouse tambem.
void mouseRelease(int button)
Solta o botão passado por parâmetro.
Exemplo de mousePress e mouseRelease:
// Clicando com o botao esquerdo robot.mousePress(InputEvent.BUTTON1_MASK); // Soltando o botão esquerdo robot.mouseRelease(InputEvent.BUTTON1_MASK);
void mouseWheel(int rotate)
Rola o scroll wheel, o valor indica a quantidade de vezes a rodar. Numero negativo roda para cima e positivo para baixo.
Exemplo:
// Rolando o scroll wheel para cima 2 vezes robot.mouseWheel(-2); // Rolando o scroll wheel para baixo 5 vezes robot.mouseWheel(5);
Capturando informações da tela
java.awt.Color getPixelColor(int x, int y)
Retorna a cor do pixel na posição x,y.
Exemplo:
// Pegando a cor do pixel na posição 0,0 Color cor = robot.getPixelColor(0, 0);
java.awt.image.BufferedImage createScreenCapture(java.awt.Rectangle rectangle)
Cria uma imagem contendo os pixels da tela.
Exemplo:
// Capturando imagem java.awt.image.BufferedImage bf = robot.createScreenCapture(new java.awt.Rectangle(180, 150, 370, 200)); // Salvando a imagem javax.imageio.ImageIO.write(bf, "JPEG", new File("C:/vaniomeurer.JPEG"));
A imagem que o Robot capturou:

Imagem capturada pelo Robot
Outros
void delay(int ms)
Tempo que o robô vai ficar em espera, semelhante ao sleep() da Thread, mas o delay() só para o robô e não a thread toda. O valor é em milissegundos.
Exemplo:
// Digita O robot.keyPress(KeyEvent.VK_O); robot.keyRelease(KeyEvent.VK_O); // Espera 5segundos robot.delay(5000); // Digita I robot.keyPress(KeyEvent.VK_I); robot.keyRelease(KeyEvent.VK_I);
void setAutoDelay(int ms)
Tempo que o robô vai ficar em espera entre cada ação. O valor é em milissegundos.
int getAutoDelay()
Retorna o valor setado no setAutoDelay(int ms).
Exemplo do setAutoDelay e getAutoDelay:
// Configura o robô pra que entre cada evento, ele espere 2 segundos. robot.setAutoDelay(2000); // Digita O robot.keyPress(KeyEvent.VK_O); robot.keyRelease(KeyEvent.VK_O); // Digita I robot.keyPress(KeyEvent.VK_I); robot.keyRelease(KeyEvent.VK_I); System.out.println("Robô esperando: "+ robot.getAutoDelay()+" milissegundos entre cada evento");
Nesse exemplo o robô vai esperar 2segundos para soltar o botão também.
void waitForIdle()
Espera que todos os eventos sejam finalizados antes de executar o próximo evento.
void setAutoWaitForIdle(boolean isOn)
Usa o waitForIdle() depois de cada evento automaticamente.
boolean isAutoWaitForIdle()
Retorna verdadeiro se o autoWaitForIdle estiver ativo e falso caso contrario.
Exemplo do waitForIdle, setAutoWaitForIdle e isAutoWaitForIdle:
// Move o mouse até a posição 0,0 robot.mouseMove(0, 0); // Espera até o mouse chegar a posição para pressionar o botão direito robot.waitForIdle(); robot.mousePress(InputEvent.BUTTON2_MASK); robot.mouseRelease(InputEvent.BUTTON2_MASK); // Seta para que cada evento espere até o(s) anterior(es) terminar(em) robot.setAutoWaitForIdle(true); robot.mouseMove(5, 5); if(robot.isAutoWaitForIdle()){ System.out.println("autoWaitForIdle ativo"); }
Exemplos “úteis”:
Funcionário
Digamos que sua empresa tenha um sistema de comunicação interna (Jabber, Messenger, etc…).
Que nesse sistema se você ficar um determinado tempo ocioso (sem mover o mouse ou usar o teclado) você automaticamente passa para o estado Ausente. Isso não seria legal pois você é um trabalhador exemplar e nunca fica “ausente”… então vamos criar um sistema que simule você trabalhando (haha)
Obrigado pela idéia Wagner Paz ;P
package br.com.vaniomeurer.blog.robot; import java.awt.AWTException; import java.awt.Robot; /** * Classe que simula um funcionário * * @author <a href="mailto:vaninho@gmail.com">Vanio Meurer</a> * @since 19/02/2009 */ public class Funcionario { public static void main(String[] args) throws AWTException { Robot robot = new Robot(); robot.setAutoDelay(5000); while (true) { robot.mouseMove(50, 50); robot.mouseMove(55, 55); } } }
Segurança
Digamos que você tem uma irmãzinha mais nova e quer protegê-la, nada mais justo que você saber o que ela esta fazendo no computador, não?
Então que tal batermos fotos da tela de tempo em tempo? Vamos lá! (isso serve pra namorada também haha)
package robot; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; /** * Segurança para irmã, namorada, tia e tudo mais... * * @author <a href="mailto:vaninho@gmail.com">Vanio Meurer</a> * @since 19/02/2009 */ public class Seguranca { public static void main(String[] args) throws AWTException, IOException, InterruptedException { Robot robot = new Robot(); // Pegando a resolução da tela Toolkit toolkit = Toolkit.getDefaultToolkit(); final Dimension dimension = toolkit.getScreenSize(); while (true) { // Pegando a imagem e gravando BufferedImage bi = robot.createScreenCapture(new Rectangle(0, 0, dimension.width, dimension.height)); ImageIO.write(bi, "JPEG", new File("C:/Seguranca" + System.currentTimeMillis()+".JPEG")); // Faz a thread dormir 2 minutos. Thread.sleep(120000); } } }
Ps: é zueira, não vai fica monitorando o pessoal ai não em, isso é apenas para fins didáticos.
Bom, é isso! Até a próxima.
Vânio Meurer (vaninh0)
Parabéns!!! material bem detalhando e de fácil entendimento.
Parabens!! mto bom material didático, e exemplos mto bons!
só uma duvida, teria como fazer o mouse se mover lentamente até o ponto necessario, sem ser mto rápido?
Rodrigo,
para simular o mouse movendo lentamente até o ponto desejado você poderia calcular a tangente do local atual até o ponto desejado e ir movendo o mouse de pontos em pontos.
Exemplo:
O mouse está no ponto 80,50.
Desejamos mover até o ponto 210,160.
Você moveria primeiro até 120,90, depois 137,108 e assim por diante somando de pouco em pouco até chegar no 210,160. Normalmente em games isso faz um efeito legal, não sei como funcionaria com a Robot.
Por favor comentar a respeito caso testar, até.
Parabéns pelo material, muito bom e didático.
Aproveito para uma duvida: usando o Robot, é possível eu realizar uma ação a partir de um evento de teclado ? No caso estou criando um loop de paginação por Robot e quero interromper o loop quando alguém teclar “Esc”. Obrigado
Boa tarde Josafat,
A API Robot não faz captura de teclas não. Você teria de ver alguma API para capturar a tecla pressionada, a Swing tem os listeners que fazem isso (um exemplo).
Um colega (Wagner Paz) fez uma API de captura, ainda não testei, mas ela se encontra nesse link: http://code.google.com/p/javahook/
Obrigado pela visita e fico feliz que o post tenha lhe ajudado.
Vanio estou fazendo uma aplicação que controle o computador, do celular, a partir de dados enviados via bluetooth…
Gostaria de saber como posso fazer para que eu conciga digitar algo no celular e apareça por exemplo no word…
Grato desde já
Desde Já
Boa noite Pedro Henrique, obrigado pela visita.
Não sei onde está sua dificuldade, mas se for para escrever uma frase com a Robot, segue um método que faria isso:
public void escrever(String frase) throws AWTException {
char[] digitos = frase.toCharArray();
Robot robot = new Robot();
for (int i = 0; i < digitos.length; i++) {
// Verificando se o caracter esta em caixa alta.
boolean isUpperCase = Character.isUpperCase(digitos[i]);
// Passando o digito para caixa alta para que funcione na Robot.
digitos[i] = Character.toUpperCase(digitos[i]);
if (isUpperCase) {
// Pressionando o Shift caso a letra estiver em caixa alta
robot.keyPress(KeyEvent.VK_SHIFT);
}
// Pressionando e soltando tecla.
robot.keyPress((int) digitos[i]);
robot.keyRelease((int) digitos[i]);
if (isUpperCase) {
// Soltando o Shift caso a letra estiver em caixa alta
robot.keyRelease(KeyEvent.VK_SHIFT);
}
}
}
Gostaria de saber se com a classe robot eu consigo simular um funcionario da seguinte maneira:
Tenho um aplicativo WEB e estou tentando fazer um ROBO que consiga logar nesse sistema automatico.
Obrigado
Boa tarde Alain,
Você consegueria sim simular um login no sistema.
Como:
Você precisaria configurar o seu robo para clicar no campo login, manda-lo digitar o login, clicar no campo senha, digitar a senha e depois clicar no botão Logar.
O problema:
Você vai precisar encontrar exatamente os pontos X e Y dos inputs de entrada e do botão de envio do formulario, isso pode ser um tanto trabalhoso.
Sem contar que, seu navegador vai precisar sempre obedecer as circunstancias que você pegou os pontos X e Y, por exemplo, se você pegar os pontos X e Y com seu navegador maximizado, você vai precisar que ele se mantenha maximizado enquanto roda o “robo logador”.
Outro ponto seria se o layout da pagina que voce esta logando mudar, voce provavelmente perderia sua configuração.
Solução:
Existe uma ferramente para testes chamada Selenium, com ela, você configura um “robo” para navegar em paginas HTML, com ela não se usa pontos X e Y, e sim ID´s dos atributos da páginas HTML.
Você configuraria o selenium assim:
Preencha o campo com ID LOGIN com: vaniomeurer.com.br
Preencher o campo com ID SENHA com: vaniomeurer
Clique no botão com ID: LOGAR
Fica muito mais facil.
Para ver mais sobre o Selenium, visite: http://seleniumhq.org/
Espero ter ajudado.
Abraço
Quero saber si tem como criar um monitoramento, estilo o vnc. Para capturar a tela de um outro computador.
Aguardo Respostas
@Juan Carlos Cunha
Juan Carlos, o Robot seria útil para ser usado na aplicação do lado do “cliente”. Onde as informações seriam enviadas e o robo faria os passos.
Para fazer a aplicação no lado do administrador, você poderia utilizar a api http://code.google.com/p/javahook/.
Mas é possivel ser feito sim.
PS: Você precisaria tratar a imagem que seria enviada do cliente para o administrador, para que ela não fique muito grande fazendo a aplicação ficar lenta.
Olá Mailto ,lí sobre a classe robots no seu site e gostaria de saber como faço pra enviar essa imagem via socket á um
servidor em outra máquina.Ah,excelente matéria!Foi de grande ajuda pra mim que preciso usar essa classe e não tenho
quase nenhum conhecimento.
Estou fazendo um trabalho para a matéria de redes e queria uma mãozinha.
Espero que possa me ajudar
Obrigada desde já.
–
att,
Kamila J. da Silva
Bom dia Kamila, obrigado pelo elogio, fico feliz que tenha sido util.
Sobre seu problema, o que ocorre é:
O BufferedImage não é serializavel, então não se pode envia-lo por sockets.
Para isso você pode utilizar o método write com os parametros img, tipo (em string, “JPG”, “BMP”…) e o OutputStream, e é esse stream que você vai transferir via socket.
Do outro lado você pode utilizar o ImageIO.read para recuperar a BufferedImage.
Isso tudo em teoria, pois nunca tentei.
Mas seria interessante você tentar e dizer aqui o resultado.
Caso não funcionar, grave o arquivo em disco com o ImageIO.write (conforme exemplo do post) e leia o arquivo em stream e depois apague-o, esse é certo que funciona, porem fica menos elegante.
É isso, bom trabalho.
Até.
Olá
Primeiramente parabens pelo artigo esta muito bom.
Preciso criar uma aplicação que leia dados a partir de uma planilha do execel e usa esses dados para por exemlo prrencher um form de cadastro.
No sentido invero a aplicação lê algumas linhas na pagina ou form e os grava na planilha excel.
Muito Grata desde já!
att,
Kamila J. da Silva
@Mirian
Obrigado pelo elogio Kamila (ou Mirian).
Qual seria exatamente a dúvida?
Adiantando, a muito tempo trabalhei com uma biblioteca chamada pom.jar para ler planilhas do Excel.
Oi, tudo bem ? Primeiramente quero parabenizar o seu post, estah muito claro, eu consegui implementar o codigo na minha aplicacao.
No entanto estou com uma duvida, eu preciso executar comandos como ctrl+r, ctlr+s e alt+f4, eu consigo executar eles no meu desktop, mas o que eu preciso eh que esses comandos sejam executados na sessao do servidor, que vai estar com a tela minimizada no momento da execucao.
Os comandos com a classe Robot nao sao executados dessa maneira, existe alguma solucao?
No aguardo…
@Adriano
Estranho não estar funcioando c/ a aplicação minimizada, pois comigo sempre funcionou normal.
Esta subindo alguma exception?
Não sei como esta seu servidor, mas se não possui ambiente gráfico, é possivel que de algum erro (não tenho certeza), talvez teria de mudar o GraphicsDevice.
O servidor eh o Windows 2003, tem um ambiente grafico, eu ateh coloquei como parametro : GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice()
Mesmo assim o alt+f4 nao ta funcionando, os demais comandos funcionam menos ele.
e lanco sim a AWTException, no entanto, nao acontece nenhum erro
Ola eu descobri pq os comandos nao tem efeito. Quando a sessao esta minizada a tela fica fora de foco no sistema, entao os comandos sao feitos sem a o programa no foco.
Vc saberia como eu possoo deixar uma tela aberta do windows com o foco ???
Eu ja tentei ALT+ TAB, mas nao funcionou…