刚学习完java se 由于是自学免不了绕弯子,好在各大神鼎力相助,问题都得到解决,希望能够帮到遇到同样问题的朋友。
这些天在做一个超级迷你的MyEclipse,于是用到了Java.awt.Robot中的
void | keyPress(int keycode) Presses a given key. |
void | keyRelease(int keycode) |
两个方法,看了几篇博文,都没能解决我的问题。
1.组合键的问题
本来利用这个VK_RIGHT_PARENTHESIS
static int | Constant for the ")" key. |
robot.keyPress(KeyEvent.VK_RIGHT_PARENTHESIS);
robot.keyRelease(KeyEvent.VK_RIGHT_PARENTHESIS);
输出“)”是符合逻辑的,可是事实上结果就是报错,无效的键值。
Exception in thread"AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid keycode
上网看几篇博文,无果,想实际操作利用组合键输入,于是试了一下。结果可以。
if(k.getKeyChar() == '('){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
于是想到这是由于按下的键值和释放的键值不同所造成的。
2.双引号的问题
if(k.getKeyChar()== '"'){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_QUOTE);
//robot.keyRelease(KeyEvent.VK_QUOTE);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
本来这段小代码心想是不可能会出错,然而不然。运行的结果是当我输入一次双引号后,出现类似死循环的情况,会一直模拟输出双引号。可是,控制台上没有报错,于是猜想我的句子语义出错。困扰很久,一直在网上找,问师兄问大神,结果无果。直到我找到ForeverDWYW的博客 中转载的一篇博文《java Robot类模拟键盘按键和鼠标点击(全局模拟)》,其中有一小段专门模拟输出双引号
- //输入双引号
- robot.keyPress(KeyEvent.VK_SHIFT);
- robot.keyPress(KeyEvent.VK_QUOTE);
- robot.keyRelease(KeyEvent.VK_SHIFT);
- robot.keyRelease(KeyEvent.VK_QUOTE);
我很疑惑,试了一下。于是在以更快输出速度的死循环中,我想到了造成上一个问题的原因,模拟的键盘值出错了。猜想由于VK_QUOTE按下后没有及时的释放于是出现所谓的死循环。更困惑的问题出现了,我明明按下后没有延迟就利用robot.keyRelease(KeyEvent.VK_QUOTE);释放了。好吧于是马上查java键盘关于组合键键值的输入输出,结果无果。生活在于勇敢尝试,想到技能中断(别问为什么想到),于是我勇敢注释robot.keyRelease(KeyEvent.VK_QUOTE);,结果出乎意料,成了。试了一下另外几个括号、单撇号,都可以。
于是我更加困惑,为什么不释放反而可以,好吧,还是键值的问题,我猜想和输入英文和中文字符有关。于是这个问题只能期待有大神撰文了。
贴一段测试
import java.awt.Robot;
import java.awt.event.KeyEvent;import javax.swing.JTextArea;
import javax.swing.JFrame;
import java.awt.event.KeyEvent;
import java.awt.event.KeyAdapter;
import java.awt.AWTException;
import java.awt.Font;
public class Test{
private JFrame jf = null;
private JTextArea jta = null;
private Robot robot = null;
private KeyEvent k = null;
public void init (){
jf = new JFrame("测试窗口");
jta = new JTextArea(100,100);
jf.setBounds(200,200,200,200);
jta.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent k){
editAssist(k); //调用方法
}
});
jta.setFont(new Font("宋体",Font.PLAIN,18)); //用于调整字体
jf.add(jta);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static void main(String[] args){
new Test().init();
}
public void editAssist(KeyEvent k){
this.k = k;
try{
robot = new Robot();
}catch(AWTException awt){
awt.printStackTrace();
}
if(k.getKeyChar()== '{'){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_CLOSE_BRACKET);
//robot.keyRelease(KeyEvent.VK_CLOSE_BRACKET); 注释掉,没有释放键值也是可以的,求大神
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
if(k.getKeyChar() == '('){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_0);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
if(k.getKeyChar() == '['){
robot.keyPress( KeyEvent.VK_CLOSE_BRACKET);
robot.keyRelease( KeyEvent.VK_CLOSE_BRACKET);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
if(k.getKeyChar() == '"'){
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_QUOTE); //没注释前会出现死循环
robot.keyRelease(KeyEvent.VK_QUOTE);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
if(k.getKeyChar() == '\''){
robot.keyPress(KeyEvent.VK_QUOTE);
robot.keyRelease(KeyEvent.VK_QUOTE); //没注释前 英文输入状态的会出现死循环
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
//这里按下和释放的键值一致,所以没有问题
if(k.getKeyChar() == '<'){
robot.keyPress(KeyEvent.VK_LESS);
robot.keyRelease(KeyEvent.VK_LESS);
robot.delay(100);
robot.keyPress(KeyEvent.VK_LEFT);
robot.keyRelease(KeyEvent.VK_LEFT);
robot.delay(100);
}
}
}