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)
Vanio Meurer Java SE java, java.awt.Robot, robo, robot