Getkeycodeforchar printando errado

getExtendedKeyCodeForChar está printnado errado:

Usando essa classe de teste:

package test;

import iRobot.iRobot_Functions;


public class Test {
    public static void main(String[] args) {
        String admUsr = "HOMP\\adm03!@";
        iRobot_Functions irf = new iRobot_Functions();
        irf.Wait(3000);
        irf.Send(admUsr);
        System.out.println(admUsr);
    }
}
package iRobot;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

import java.io.IOException;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class iRobot_Functions {
  Robot r;
  public void Wait(int i)
  {
      Robot r;
      try {
          r = new Robot();
          r.delay(i);
      } catch (AWTException ex) {
          Logger.getLogger(iRobot_Functions.class.getName()).log(Level.SEVERE, null, ex);
      }
  }
  // pressionar teclas
  public void Press(int keyCode) {
      try {
        r = new Robot();
        r.keyPress(keyCode);
        r.delay(200);
        r.keyRelease(keyCode);
        r.delay(200);
      } catch (AWTException ex) {
        Logger.getLogger(iRobot_Functions.class.getName()).log(Level.SEVERE, null, ex);
      }
  }
    public void Send(String s) {
        if (null == s) return;
        Robot r = null;
        char[] chars = s.toCharArray();
        try {
            for (char c : chars) {
                int code = c;
                int keyCode = KeyEvent.getExtendedKeyCodeForChar(code);
                r = new Robot();
                r.delay(40);
                r.keyPress(keyCode);
                r.keyRelease(keyCode);
            } 
        } catch (AWTException ex) {
            System.err.println(ex.getMessage());
        }
    }
}

No system.out.println está printando certo HOMP\adm03!@

Mas no Send está printnado errado homp\adm0312

Ignorando shifts e usando homp ao inves de HOMP 1 ao inves de ! 2 ao inves de @

Alguem sabe como arrumar isso?

Você só postou a classe iRobot_Functions
Esqueceu de postar a classe onde testa os métodos Wait, Press e Send.
Dica: procure seguir a convenção de código para nomear suas classes e métodos, assim não está legal

Pergunta:
Se r é uma variável de instância, qual o motivo de você reinicializar ela em cada método?

1 curtida

Desculpa esqueci mesmo (editei lá)…
Vou pesquisar sobre a a convenção de código depois, tinha ouvido falar quando comecei a estudar JAVA, pra nomear variáveis de um jeito, funções de outro…
Como você acha que deveria ser o R? iniciado abaixo do Robot r; como se fosse uma instância global? Não sabia que isso era correto.

Não achei o println no método Send.
De qualquer forma, você precisa saber identificar a partir do caracteres quando o Robot precisa segurar a tecla Shift ao pressionar o teclado.
Por exemplo, a tecla do @ realmente é a tecla 2, mas você só obtém o símbolo @ quando pressiona Shift + 2.
Nesse post do StackOverflow tem um exemplo de como lidar com isso fazendo um Map:

Já que sua classe iRobot_Functions encapsula um objeto da classe Robot, eu inicializaria na declaração ou então no construtor.
Java não tem o conceito de global como em outras linguagens, o mais próximo de algo global no Java é você declarar o membro como public static.
E se o membro é de instância, então não pode ser static, pois static é membro de classe.

1 curtida

Nossa mano, você realmente me ajudou muito, muito obrigado!