Arquivo

Textos com Etiquetas ‘robot’

Como usar a classe Robot (java.awt.Robot)

19, fevereiro, 2009

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 , , ,