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)