“我的自动打字机程序中没有输入字符

时间:2015-04-24 06:37:14

标签: java keypress awtrobot

此程序从文件中读取并根据配置设置逐行或在句子的末尾输入其内容。它使用Java.awt.Robot来执行此操作,并且可以键入除撇号和引号字符之外的所有键盘字符。键是键盘上的功能,其他脚本可以键入它。我无法弄清楚为什么这个程序无法正确输入。

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

public class SmartRobot extends Robot {

    public int count70=0;

 public SmartRobot() throws AWTException {
  super();
 }

 public void keyType(int keyCode) {
 if(keyCode == -1)
     return;
  keyPress(keyCode);
  delay(2);
  keyRelease(keyCode);
 }

 public void keyType(int keyCode, int keyCodeModifier) {
  keyPress(keyCodeModifier);
  keyPress(keyCode);
  delay(2);
  keyRelease(keyCode);
  keyRelease(keyCodeModifier);
 }


 public void type(String text) {
     if(text.length()>1 && text.substring(0, 1).equals("\\")){
         Driver.codeTimeEnd = System.nanoTime();
          delay(Integer.parseInt(text.substring(2, text.length()))-(int) (Driver.codeTimeEnd-Driver.codeTimeStart)/1000000000);
      return;
     }
  String textUpper = text.toUpperCase();
  for (int i=0; i<text.length(); ++i) {
   typeChar(textUpper.charAt(i));
  }  
  if(!Driver.enterAtPeriods || !Driver.enterUnder60)keyPress(KeyEvent.VK_ENTER);
  Driver.codeTimeEnd =  System.nanoTime();
  if(!Driver.enterUnder60)
      delay(Driver.lineDelay-(int)(Driver.codeTimeEnd-    Driver.codeTimeStart)/1000000000);
  else
      delay(2);
 }

 public void typeChar(char c) {
  boolean shift = true;
  int keyCode;

  switch (c) {
  case '~':keyCode = (int)'`';break;
  case '!':keyCode = (int)'1';break;
  case '@':keyCode = (int)'2';break;
  case '#':keyCode = (int)'3';break;
  case '$':keyCode = (int)'4';break;
  case '%':keyCode = (int)'5';break;
  case '^':keyCode = (int)'6';break;
  case '&':keyCode = (int)'7';break;
  case '*':keyCode = (int)'8';break;
  case '(':keyCode = (int)'9';break;
  case ')':keyCode = (int)'0';break;
  case ':':keyCode = (int)';';break;
  case '_':keyCode = (int)'-';break;
  case '+':keyCode = (int)'=';break;
  case '|':keyCode = (int)'\\';break;
  case '"':keyCode = (int)'\'';break;
  case '?':keyCode = (int)'/';break;
  case '{':keyCode = (int)'[';break;
  case '}':keyCode = (int)']'; break;
  case '<':keyCode = (int)',';break;
  case '>':keyCode = (int)'.';break; 
  case '“':keyCode = (int)'\'';break;
  case '”':keyCode = (int)'\'';break;
  case '…':keyCode = (int)' ';break;
  case '‘':keyCode = (int)'\'';break;
  case '’':keyCode = (int)'\'';break;
 default:
//  System.out.println(c);
   keyCode = (int)c;
//   System.out.println(keyCode);
   shift = false;
  }
  if(Driver.enterUnder60){
      count70++;
      if(count70>70)
          if(c == ' '){
              count70 = 0;
              keyType(KeyEvent.VK_ENTER);
              delay(Driver.lineDelay-(int)(Driver.codeTimeEnd-Driver.codeTimeStart)/1000000000);
              return;
          }
  }
  if(Driver.enterAtPeriods){
      if(c == '.'){
          count70 = 0;
          keyType(KeyEvent.VK_ENTER);
          delay(Driver.lineDelay-(int)(Driver.codeTimeEnd-Driver.codeTimeStart)/1000000000);
          return;
      }
 }
  if (shift){
   keyType(keyCode, KeyEvent.VK_SHIFT);
   System.out.println("works");
  }
  else
   keyType(keyCode);
 }

 private int charToKeyCode(char c) {
  switch (c) {
  case ':':
   return ';';
  }
  return (int)c;
 }
}

infile可以是你想要的任何东西,所有字符都会被显示,但是“不会被输入。我不知道在它的情况下是否访问过type()方法。 以下是输入示例:

"Hi, my name is koikoi."

输出结果如下:

Hi, my name is koikoi.

什么时候应该有报价。 typer无法识别/阅读它们。我在代码中找不到任何缺陷,并希望得到一些建议。如果需要,我可以添加main方法。

0 个答案:

没有答案