Depois de mais uma das intermináveis discussões sobre o que dá para se fazer em java e o que não dá para fazer em java. Fui obrigado a pesquisar a classe java.awt.Robot.
A classe Robot está presente no Java desde a versão 1.4.2 e segundo a definição no JavaDoc essa classe é utilizada para gerar input no sistema operacional nativo. Como possível uso o JavaDoc indica a automação de tarefas, apresentação de demos de sistemas e geração de testes.
A classe Robot possui um construtor padrão e outro onde é possível determinar qual o dispositivo de saída padrão (geralmente é o vídeo mas pode ser a impressora). Essa classe possui 15 métodos que eu classificaria da seguinte forma:
Eventos de Teclado:
void keyPress(int keycode) – utilizado para simular o pressionamento de uma tecla;
void keyRelease(int keycode) – remove o status de pressionada de uma tecla utilizada pelo método keyRelease;
Eventos de Mouse:
void mouseMove(int x, int y) – move o mouse para o posição x,y;
void mousePress(int buttons) – pressiona um dos botões do mouse;
void mouseRelease(int buttons) – remove a pressão efetuada pelo método mouseRelease(int buttons);
void mouseWheel(int wheelAmt) – Indica o número de vezes que o scroll será utilizado (aceita valores negativos).
Eventos de Vídeo:
BufferedImage createScreenCapture(Rectangle screenRect) – Captura a imagem existente na tela (na verdade no dispositivo padrão de saída);
Color getPixelColor(int x, int y) – captura a cor do pixel na posição x,y;
Métodos Acessórios:
void delay(int ms) – deixa o a instância de Robot parada (sleeping) por int milisegundos;
void setAutoDelay(int ms) – informa o tempo que a instância da classe Robot deve esperar depois de gerar um evento;
int getAutoDelay() – obtém o valor do autodeley da instância de Robot;
void waitForIdle() – Aguarda até que todos os eventos que estão na fila sejam processados;
void setAutoWaitForIdle(boolean isOn) – define se a instância sempre deve aguardar se todos os eventos da fila sejam processados;
boolean isAutoWaitForIdle() – verifica o estado do autoWaitForIdle;
String toString() – esse método dispensa comentários.
Agora vamos a um exemplo de utilização dessa classe – O exemplo de código abaixo abre a calculadora digita 25+12= e copia o resultado abre o bloco de notas e cola o resultado:
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.io.IOException;
public class Robo {
private Robot robot;
public Robo() throws AWTException {
robot = new Robot();
}
/*** Executa um comando no SO..*/public void execute(String comando) throws IOException {
Runtime.getRuntime().exec(comando);robot.delay(5000); // Tempo para o programa abrir
}
/*** Copia os dados para a área de transferência.*/public void copiar() {
robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_C);robot.keyRelease(KeyEvent.VK_C);robot.keyRelease(KeyEvent.VK_CONTROL);robot.delay(2000);
}
/*** Cola os dados que estão na área de transferência.*/public void colar() {
robot.keyPress(KeyEvent.VK_CONTROL);robot.keyPress(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_V);robot.keyRelease(KeyEvent.VK_CONTROL);robot.delay(2000);
}
/*** Executa a digitação de uma sequência de caracteres.*/public void executeTeclas(int... keys) {
if (keys != null) {
for (int key : keys) {
robot.keyPress(key);robot.keyRelease(key);
}
}robot.delay(2000); // tempo para o usuário ver o que foi digitado
}
public static void main(String[] args) throws AWTException, IOException {
Robo robo = new Robo();
// Número 25 seguido do sinal +int[] primeira = { KeyEvent.VK_2, KeyEvent.VK_5, KeyEvent.VK_ADD };// Número 12 seguido do sinal =int[] segunda = { KeyEvent.VK_1, KeyEvent.VK_2, KeyEvent.VK_EQUALS };
robo.execute("calc");robo.executeTeclas(primeira);robo.executeTeclas(segunda);
robo.copiar();robo.execute("notepad");robo.colar();
}
}
Em outro post apresentarei um exemplo utilizando eventos do mouse e da saída padrão.
0 comentários: