使用Java发送组合键

使用Java发送组合键,java,awt,keypress,awtrobot,Java,Awt,Keypress,Awtrobot,根据前面的链接()Java可以使用Robot类模拟按键。然而,如何模拟按键组合?如果我想发送组合“alt-123”,使用Robot可以吗?这是一个示例 Robot r = new Robot(); Thread.sleep(1000); r.keyPress(KeyEvent.VK_ALT); r.keyPress(KeyEvent.VK_NUMPAD1); r.keyPress(KeyEvent.VK_NUMPAD2); r.keyPress(KeyEvent.VK_NUMPAD3);

根据前面的链接()Java可以使用Robot类模拟按键。然而,如何模拟按键组合?如果我想发送组合“alt-123”,使用Robot可以吗?

这是一个示例

Robot r = new Robot();
Thread.sleep(1000);

r.keyPress(KeyEvent.VK_ALT);
r.keyPress(KeyEvent.VK_NUMPAD1);
r.keyPress(KeyEvent.VK_NUMPAD2);
r.keyPress(KeyEvent.VK_NUMPAD3);            
r.keyRelease(KeyEvent.VK_ALT);

别忘了释放一些特殊的键,它会在你的机器上制造一些疯狂的东西。简单的答案是肯定的。基本上,您需要将Alt的
keyPress/Release
环绕在另一个
keyPress/Release
s上

public class TestRobotKeys {

    private Robot robot;

    public static void main(String[] args) {
        new TestRobotKeys();
    }

    public TestRobotKeys() {
        try {
            robot = new Robot();
            robot.setAutoDelay(250);
            robot.keyPress(KeyEvent.VK_ALT);
            robot.keyPress(KeyEvent.VK_1);
            robot.keyRelease(KeyEvent.VK_1);
            robot.keyPress(KeyEvent.VK_2);
            robot.keyRelease(KeyEvent.VK_2);
            robot.keyPress(KeyEvent.VK_3);
            robot.keyRelease(KeyEvent.VK_4);
            robot.keyRelease(KeyEvent.VK_ALT);
        } catch (AWTException ex) {
            ex.printStackTrace();
        }
    }

}

此代码与本机windows键盘太接近。甚至Api键盘“按下”也会进入EclipseIDE,就像通常从ide按下的那个样。密钥是由当前调试的应用程序生成的!!(jdk 1.8,win 7,hp)

对于使用java.awt.Robot发送组合键,以下代码对我来说很好

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



public class VirtualKeyBoard extends Robot
{

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

    public void pressKeys(String keysCombination) throws IllegalArgumentException
    {
            for (String key : keysCombination.split("\\+"))
            {
                try
                {   System.out.println(key);
                    this.keyPress((int) KeyEvent.class.getField("VK_" + key.toUpperCase()).getInt(null));

                } catch (IllegalAccessException e)
                {
                    e.printStackTrace();

                }catch(NoSuchFieldException e )
                {
                    throw new IllegalArgumentException(key.toUpperCase()+" is invalid key\n"+"VK_"+key.toUpperCase() + " is not defined in java.awt.event.KeyEvent");
                }


            }


    }


    public void releaseKeys(String keysConbination) throws IllegalArgumentException
    {

            for (String key : keysConbination.split("\\+"))
            {
                try
                { // KeyRelease method inherited from java.awt.Robot
                    this.keyRelease((int) KeyEvent.class.getField("VK_" + key.toUpperCase()).getInt(null));
                } catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }catch(NoSuchFieldException e )
                {
                    throw new IllegalArgumentException(key.toUpperCase()+" is invalid key\n"+"VK_"+key.toUpperCase() + " is not defined in java.awt.event.KeyEvent");
                }
            }


    }

    public static void main(String[] args) throws AWTException
    {


         VirtualKeyBoard kb = new VirtualKeyBoard();


         String keyCombination = "control+a"; // select all text on screen
         //String keyCombination = "shift+a+1+c"; // types A!C on screen

         // For your case 
         //String keyCombination = "alt+1+2+3";


         kb.pressKeys(keyCombination);
         kb.releaseKeys(keyCombination); 



    }


}

我回顾了其他与Java相关的文章,这些文章显然是被引用和编辑的。在这个过程中我注意到两件事。1) AWT机器人标签的数量从144个增加到185个。机器人的不到200个帖子中有41个,或至少20%,被错误地标记。2) 编辑使AWT v的总数增加。机器人交换。现在有更多的问题标记AWT机器人比机器人。-我在想,也许我给你投反对票有点过早,因为你碰巧是一大群显然犯了同样错误的人中的一员!这似乎是针对另一个答案的评论。。。哪一个?很好的答案,非常简单和容易使用