Página Inicial > Java SE > Como usar a classe Robot (java.awt.Robot)

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

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)

Vanio Meurer Java SE , , ,

  1. Rubean
    10, julho, 2009 em 13:11 | #1

    Parabéns!!! material bem detalhando e de fácil entendimento.

  2. Rodrigo
    31, julho, 2009 em 19:49 | #2

    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?

  3. 3, agosto, 2009 em 08:14 | #3

    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é.

  4. Josafat
    23, setembro, 2009 em 16:19 | #4

    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

  5. 23, setembro, 2009 em 16:45 | #5

    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.

  6. Pedro Henrique
    30, setembro, 2009 em 20:13 | #6

    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á

  7. 30, setembro, 2009 em 22:15 | #7

    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);
    }

    }
    }

  8. Alain Leonardo
    9, novembro, 2009 em 12:58 | #8

    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

  9. 9, novembro, 2009 em 14:49 | #9

    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

  10. 15, abril, 2010 em 10:54 | #10

    Quero saber si tem como criar um monitoramento, estilo o vnc. Para capturar a tela de um outro computador.
    Aguardo Respostas

  11. 15, abril, 2010 em 16:06 | #11

    @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.

  12. kamila
    27, setembro, 2010 em 15:38 | #12

    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

  13. 27, setembro, 2010 em 16:58 | #13

    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é.

  14. Mirian
    3, dezembro, 2010 em 19:54 | #14

    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

  15. 4, dezembro, 2010 em 14:34 | #15

    @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.

  16. 10, dezembro, 2010 em 09:12 | #16

    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…

  17. 10, dezembro, 2010 em 09:39 | #17

    @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.

  18. 13, dezembro, 2010 em 11:18 | #18

    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.

  19. 13, dezembro, 2010 em 11:19 | #19

    e lanco sim a AWTException, no entanto, nao acontece nenhum erro

  20. 14, dezembro, 2010 em 14:50 | #20

    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…

  1. Nenhum trackback ainda.