Robot (Darth Vader) - Quero dominar o mundo!

E ae galera do mal, :stuck_out_tongue:
Estou querendo fazer um robo para dominar o mundo :twisted: , mas ele parou no “Ç” " e ’ :roll:
se alguém tiver alguma idéia de código e quiser compartilhar
se alguém quiser pegar esse robo (Darth) como base…

O Darth Vader reune várias funcionalidades, claro que pode ser agregado mais métodos
se alguém tiver algum ai, manda ver, vai legal contruir algo em grupo

Aqui reuni vários tutorias na internet, acho que serve como uma boa base
Está pegando todas as acentuções,
Só está parado no Ç, ç , " , ’ e o ? está saindo como /

Boa sorte a todos, Obrigado!

Mapeamento de todos os caracteres

package br.com.teste;

import java.awt.event.KeyEvent;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public final class MapaCaracteres {  
  
    public static final Map<Character, Integer> KEYS;  
  
    static {  
        Map<Character, Integer> map = new HashMap<Character, Integer>();  
        for (char c = 'A'; c <= 'Z'; c++) {  
            map.put(c, (int) c);  
        }  
        for (char c = '0'; c <= '9'; c++) {  
            map.put(c, (int) c);  
        }  
        for (char c = '\b'; c <= '\n'; c++) {  
            map.put(c, (int) c);  
        }
        for(char c='À';c<='Ä';c++){
        	map.put(c, 65);
        }
        for(char c='È';c<='Ë';c++){
        	map.put(c, 69);
        }
        for(char c='Ì';c<='Ï';c++){
        	map.put(c, 73);
        }
        for(char c='Ò';c<='Ö';c++){
        	map.put(c, 79);
        }
        for(char c='Ù';c<='Ü';c++){
        	map.put(c, 85);
        }
        
        map.put('\'', KeyEvent.VK_QUOTEDBL);  
        map.put('\"', KeyEvent.VK_QUOTEDBL); 
        map.put('!', KeyEvent.VK_1);  
        map.put('@', KeyEvent.VK_2); 
        map.put('#', KeyEvent.VK_3);
        map.put('$', KeyEvent.VK_4); 
        map.put('%', KeyEvent.VK_5);
        map.put('¨', KeyEvent.VK_6);
        map.put('&', KeyEvent.VK_7);
        map.put('*', KeyEvent.VK_8); 
        map.put('(', KeyEvent.VK_9); 
        map.put(')', KeyEvent.VK_0);
        map.put('-', KeyEvent.VK_MINUS);
        map.put('_', KeyEvent.VK_MINUS);
        map.put('+', KeyEvent.VK_EQUALS); 
        map.put('=', KeyEvent.VK_EQUALS);
        
        map.put('`', KeyEvent.VK_DEAD_ACUTE);
        map.put('´', KeyEvent.VK_DEAD_ACUTE);
        map.put('~', KeyEvent.VK_DEAD_TILDE);  
        map.put('^', KeyEvent.VK_DEAD_TILDE);
        map.put('[', KeyEvent.VK_OPEN_BRACKET);  
        map.put(']', KeyEvent.VK_CLOSE_BRACKET);  
        map.put('{', KeyEvent.VK_OPEN_BRACKET);  
        map.put('}', KeyEvent.VK_CLOSE_BRACKET);
        map.put('Ç', KeyEvent.VK_DEAD_CEDILLA);
        
        map.put('\\',KeyEvent.VK_BACK_SLASH);  
        map.put('|', KeyEvent.VK_BACK_SLASH); 
        map.put(',', KeyEvent.VK_COMMA); 
        map.put('<', KeyEvent.VK_COMMA); 
        map.put('.', KeyEvent.VK_PERIOD);
        map.put('>', KeyEvent.VK_PERIOD);
        map.put(';', KeyEvent.VK_SEMICOLON);  
        map.put(':', KeyEvent.VK_SEMICOLON); 
        map.put('/', KeyEvent.VK_DIVIDE);  
        map.put('?', KeyEvent.VK_DIVIDE);
        map.put(' ', KeyEvent.VK_SPACE); 
            
        KEYS = Collections.unmodifiableMap(map);  
    }
    private MapaCaracteres() {  
            // can not instantiate  
    } 
  }

Principais funcionalidades

package br.com.teste;
import static br.com.teste.MapaCaracteres.KEYS;
import static java.awt.event.InputEvent.BUTTON1_MASK;
import static java.awt.event.InputEvent.BUTTON2_MASK;
import static java.awt.event.KeyEvent.VK_NUMBER_SIGN;
import static java.awt.event.KeyEvent.VK_SHIFT;

import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
   
public final class DarthVader {
	private Robot robot;
	private BufferedImage imagemArquivo, imagemPedaco,imagemInteira;
   
    public DarthVader(Robot robot) throws NullPointerException {  
         if (robot == null) {  
             throw new NullPointerException();  
         }  
         this.robot = robot;  
     }     
     public void clique(int x, int y) {  
         robot.mouseMove(x, y);  
         robot.mousePress(BUTTON1_MASK);  
         robot.mouseRelease(BUTTON1_MASK);           
     }     
     public void cliqueDireito(int x, int y) {  
         robot.mouseMove(x, y);  
         robot.mousePress(BUTTON2_MASK);
         robot.mouseRelease(BUTTON2_MASK);         
     }    
     public void datilografar(int key) {  
         robot.keyPress(key);  
         robot.keyRelease(key);  
     }   
     public void datilografarSequencia(int... keys) {  
         for (int i = 0; i < keys.length; i++) {  
             robot.keyPress(keys[i]);  
         }  
         for (int i = keys.length - 1; i >= 0; i--) {  
             robot.keyRelease(keys[i]);  
         }  
     } 
     public void rolarMouse(int rotacao){
    	 robot.mouseWheel(rotacao);
     }
    public void datilografar(String string) {
    	char acento=' ';
         for (char c : string.toCharArray()) {
        	 acento=precisaAcentuar(c); 
        	 if(acento!=' '){
        		 escreve(acento);
        		 escreve(c);
        	 }else{
        		 escreve(c);
        	 }
             
         }  
     }  
     private void escreve(char c){
    	 if (Character.isUpperCase(c) || precisaPrecionarShift(c)) {  
             robot.keyPress(VK_SHIFT);  
         }  
         Integer i = KEYS.get(Character.toUpperCase(c));  
         if (i == null) {  
             i = VK_NUMBER_SIGN;  
         }  
         datilografar(i);  
         if (Character.isUpperCase(c) || precisaPrecionarShift(c)) {  
             robot.keyRelease(VK_SHIFT);  
         }  
    	 
     }
     private boolean precisaPrecionarShift(char c) {  
         return c == '!' || c == '@' || c == '#' || c == '$' || c == '%'|| c == '¨'  
                 || c == '&' || c == '*' || c == '(' || c == ')' || c == '`'|| c == '_'  
                 || c == '{'|| c == '+' || c == '}' || c == '^' || c == '?' || c == ':'  
                 || c == '>' || c == '<' || c == '|' || c == '\"' || c == '\'';  
     }
     private char precisaAcentuar(char c){
    	  if(c=='Á'||c=='É'||c=='Í'||c=='Ó'||c=='Ú'||
    			  c=='á'||c=='é'||c=='í'||c=='ó'||c=='ú'){
    		  return '´';
    	  }else if(c=='Â'||c=='Ê'||c=='Î'||c=='Ô'||c=='Û'||c=='â'||
    			  c=='ê'||c=='î'||c=='ô'||c=='û'){
    		  return '^';
    	  }else if(c=='Ã'||c=='Õ'||c=='ã'||c=='õ'){
    		  return '~';
    	  }else if(c=='À'||c=='È'||c=='Ì'||c=='Ò'||c=='Ù'||c=='à'||
    			  c=='è'||c=='ì'||c=='ò'||c=='ù'){
    		  return '`';
    	  }else if(c=='Ä'||c=='Ë'||c=='Ï'||c=='Ö'||c=='Ü'||c=='ä'||
    			  c=='ë'||c=='ï'||c=='ö'||c=='ü'){
    		  return '¨';
    	  }else{
    		  return ' ';
    	  }
     }
     private boolean compararImagens(BufferedImage image1, BufferedImage image2) {
 		if(image1.getWidth() != image2.getWidth() || image1.getHeight() 
 				!= image2.getHeight())
 			return false;

 		for(int x = 0; x < image1.getWidth(); x++) {
 			for(int y = 0; y < image1.getHeight(); y++) {
 				if(image1.getRGB(x, y) != image2.getRGB(x, y))
 					return false;
                 }
             }
             return true;
 	}
    public void capturarImagemPedaco(int inicioH,int inicioV,int altura,int largura){
    	imagemPedaco = robot.createScreenCapture(new Rectangle(inicioH, inicioV,altura,
    			largura));    	
    }
    public void capturarImagem(){
    	Toolkit toolkit = Toolkit.getDefaultToolkit();
    	final Dimension dimension = toolkit.getScreenSize();
		while (true) {
			// Pegando a imagem e gravando
			imagemInteira = robot.createScreenCapture(new Rectangle(0, 0,
					dimension.width, dimension.height));
			try {
				ImageIO.write(imagemInteira, "JPEG", new File("C:\\LogalSavamento.JPEG"));
			} catch (IOException e) {
				System.out.println("Não foi possivel Guardar a imagem");
				e.printStackTrace();
			}
		}   	
    	
    }
    public void carregarImagem(String arquivo){
    	try {
			imagemArquivo = ImageIO.read(new File(arquivo));
		} catch (IOException e) {
			System.out.println("Não foi possível carregar o arquivo");
			e.printStackTrace();
		}
    }    
   
 }  

Classe de teste das funcionalidades

package br.com.teste;

import java.awt.AWTException;
import java.awt.Robot;
import java.io.IOException;

public class Teste1 {
	public static void main(String[] args) throws AWTException, IOException{
		Robot robo= new Robot();
		DarthVader rob= new DarthVader(robo);
		Runtime.getRuntime().exec("notepad" );
		robo.delay(1500);
		
		rob.datilografar("O cachorro é português, é sim ão ão ão üüÜ, !@#$%¨&*()_+{}`^?;.,<>:ããõ");
		
//		for(int i=0;i<256;i++){
//			System.out.println("Valor de i: "+i+"Ascii: "+(char)i);
//		}
	}
	

}

interesante velho!

já pensou em criar um sistema de macros? seria ótimo para testes automaticos… basicamente iria criar um gravador de macro que seria simplesmente um keylogger que grava em um arquivo o que foi feito tipo:

mousemove(15,240);
keypress(J);

ou algo do genero… dai para executar o macro o programa le o arquivo e executa sua classe por exemplo pra fazer as ações contidas no macro… assim pode-se automatizar as coisas inclusive testes…
comecei a fazer algo parecido mas por falta de tempo deixei a coisa parada…

Realmente muito interessante,

Estou pensando em integrar robot com selenium,
pois o selenium é muito mais leve,
e ele é próprio para teste web. :stuck_out_tongue:

Porém onde o selenium não alcançar, Robot (Darth Vader ) estará lá para apoiar. :twisted:

Mais e ae luistiagos, você consegui colocar para rodar, digitar nomes e etc?
se souber como se coloca o ? ç " e ’ manda ae para mim
:cry:

O que eu estava fazendo travou por causa dessa pendita tecla “?”
se eu consegui digitar ela, poderei avançar muito.

Falou, um abraço!

cara se vc perceber para estas teclas vc deve apertar 2 teclas ao mesmo tempo… tipo o “?” é Shift + / e entre outras…então tente para estas colocar 2 KeyEvents

Eu entedi o que vc quis dizer,
Essa é a lógica, Mas não acontece. :evil:

Quando aperto o Shift + / deveria dar ?, mas o que sai é /
O Ç , " e ’ eu não faço nem idéia como fazer

Falou, um abraço! :wink:

[quote=Cl?ber Jos]Eu entedi o que vc quis dizer,
Essa é a lógica, Mas não acontece. :evil:

Quando aperto o Shift + / deveria dar ?, mas o que sai é /
O Ç , " e ’ eu não faço nem idéia como fazer

Falou, um abraço! :wink: [/quote]
Rapaz, esse seu projeto aí é ambicioso heim?

Ok, quanto a esse negócio de ficar gerando eventos de baixo nível de teclado e mouse no Java, tenho alguma experiência graças ao meu projeto open-source “Satan-AnyWhere”.
Antigamente, eu usava o velho SWT no lugar do AWT para controlar remotamente uma máquina, via o método “public boolean post(Event event)” da classe “Display” do SWT.
Com AWT eu também não consigo digitar o caractere ‘/’ na maioria dos teclados que tenho disponível, mas pode ser que com SWT dê certo.

Inté.

Java é a linguagem errada para esse tipo de automação. Você está embaixo de uma VM e o Robot não funciona da mesma forma em vários SOs.
O ideal é fazer mesmo em C++. Ali você pode fazer algo que realmente domine o mundo.

Por mais que você se esforce, vai ser muitíssimo difícil sequer chegar perto do que o AutoIt faz.

Esse meu código digita /

Vou dar uma olhada nesse AutoIt, gostei da propaganda.
Pelo jeito não vou poder dominar o mundo usando Java.

Mesmo assim gostaria de saber como digirar o ? Ç ç ’ e "
se alguém tiver alguma idéia…

Obrigado pela colaboração, falou, um abraço!

[quote=Cl?ber Jos]Eu entedi o que vc quis dizer,
Essa é a lógica, Mas não acontece. :evil:

Quando aperto o Shift + / deveria dar ?, mas o que sai é /
O Ç , " e ’ eu não faço nem idéia como fazer

Falou, um abraço! :wink: [/quote]

Isto o porque ele usa o padrão de teclado americano…
dai esta combinação é o “Ç” no americano… pra facilitar configure seu teclado no formato americano
e veja as combinações certas…

reamente essa parece ser uma boa idéia,
vou tentar fazer isso aqui

fallou, um abraço :wink:

Outra coisa… a palavra pre[color=red]c[/color]ionar está errada. O correto é pressionar.

Também faltou uma Thread fazendo sons de um respirador enquanto o programa roda. :lol:

Mesma coisa, :evil:
A interrogação também não entra
Os demais caracteres eu nem quis testar.

E como ele não está conseguindo fazer essas tarefas básicas, não tem motivo para eu cologar o respirador,
caso funcione, vai ser uma boa idéia. :wink:

Vou ver se tem como copiar o valor de uma variável para a área de trasferência e depois escrever onde for preciso

Tenho que ver como fazer isso, se alguém souber como… :wink:

Falou, um abraço!

Olha mais um aqui pra falar que a ideia é interessante. :smiley:

Então, quanto aos problemas citados, as aspas estão funcionando, a única correção seria remover a aspa simples no final do método “precisaPressionarShift”.

Cedilha você consegue com acento agudo + C.

O que cai no problema que o ViniGodoy citou é o ponto de interrogação. No MapaDeCaracteres está definida a constante VK_DIVIDE, só que esta constante representa a barra do NumPad, por isso sempre aparece a barra, mesmo com shift pressionado. Aquela barra ao lado shift é VK_SLASH. Eu testei no Linux (Debian Lenny) e funcionou normalmente com VK_SLASH. Mas no Windows (XP) lança uma IllegalArgumentException “invalid key code”. Teria que ver se nas versões mais novas do Windows vai funcionar.

O lado negro da força não é tão negro como eu imaginei! :evil: :lol:
Encontrei uma solução e um novo problema.

Primeiramente gostaria de agradecer a todos pelo apoio.

*Ainda não testei o SWT, Se consegui alguma coisa posteriormente postarei aqui
*A ferramenta Autoit3 não me despertou interesse, pois não quero ter que relembrar tudo de C++, pelo que eu vi, vou ter que programar muito. :lol:
*Você deve fazer o mapeamento das teclas de acordo com o teclado que você estiver usando, principalmente a pontuação.

  • Eric Yuzo, Vou dar uma olhada aqui, mas o Ç e aspas não funcionou, vou dar uma olhada na lógica, bem observado as aspas simples.
  • Tive esse mesmo problema, com o VK_SLASH.
  • Já arrumei o “precionar” (pressionar) foi mal :oops:

Para a digitação do Darth, decidi colocar o valor de uma variável na área de transferência e então dar um Control V onde quero que o conteúdo seja colocado.
Solução:

Clipboard board = Toolkit.getDefaultToolkit().getSystemClipboard();  
         ClipboardOwner selection = new StringSelection("Dominar o mundo çççç \"  Ç \' Não tem mais problema");  
         board.setContents((Transferable) selection, selection);

Problema:
Não está clicando com o botão direito, não mostra opções normal para o botão.
:evil:

Obrigado!

interessante, o humor do garoto é notável. ^^

Interessante a idéia do teu sistema de dominação :slight_smile: .
Só que fiquei com uma dúvida.
Parece-me que teu DarthVader funciona bem se o computador estiver utilizando teclado no padrão ABNT. E se for uma outra configuração de teclado?
Há padrões bem distintos do padrão US e do padrão ABNT onde as teclas e teclas de atalho seriam diferentes (por exemplo: algumas não necessitariam de shift ou passariam a precisar de control).