900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 利用 Java.awt.Robot 模拟键盘输入遇到的几点问题(组合键 双引号)

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

时间:2023-08-01 07:45:48

相关推荐

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

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

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

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

1.组合键的问题

本来利用这个VK_RIGHT_PARENTHESIS

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);

}

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。