利用 Java.awt.Robot 模拟键盘输入遇到的几点问题(组合键,双引号)

刚学习完java se 由于是自学免不了绕弯子,好在各大神鼎力相助,问题都得到解决,希望能够帮到遇到同样问题的朋友。

这些天在做一个超级迷你的MyEclipse,于是用到了Java.awt.Robot中的

void

keyPress(int keycode)

Presses a given key.

void

keyRelease(int keycode)

两个方法,看了几篇博文,都没能解决我的问题。

1.组合键的问题

         本来利用这个VK_RIGHT_PARENTHESIS

static int

VK_RIGHT_PARENTHESIS

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类模拟键盘按键和鼠标点击(全局模拟)》,其中有一小段专门模拟输出双引号

  1.  //输入双引号  
  2.         robot.keyPress(KeyEvent.VK_SHIFT);  
  3.         robot.keyPress(KeyEvent.VK_QUOTE);  
  4.         robot.keyRelease(KeyEvent.VK_SHIFT);  
  5.         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);
}

}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值