Java KeyPress:如何检测用户在应用程序运行时是否按下了键盘上的“向下”箭头键

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9832195/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-16 08:19:43  来源:igfitidea点击:

KeyPress: How to detect if the user pressed the "Down" arrow key on their keyboard when the app is running

javakey-bindingskeylistener

提问by Mirwais Maarij

Here is what I've got so far.. I'm using this as a keybind. I want to press the "Down" arrow key anytime the app is running, and then make it auto press the "Down" arrow key 3 extra times then finish by pressing "Enter" in the code. I know this isn't the best explanation but sorry and I will try to explain it any better if you still didnt understand.

这是我到目前为止所拥有的..我将其用作键绑定。我想在应用程序运行时按“向下”箭头键,然后让它自动按“向下”箭头键 3 次,然后在代码中按“Enter”键完成。我知道这不是最好的解释,但很抱歉,如果您仍然不明白,我会尝试更好地解释它。

Here is the code:

这是代码:

public class MyKeyListener extends KeyAdapter{ 
@Override
public void keyPressed(KeyEvent evt){  
}

KeyListener keyListener = new KeyListener() {
    @Override
  public void keyPressed(KeyEvent keyEvent) {
    int keyCode = keyEvent.getKeyCode();
        if(keyCode == 1005){
        System.out.println("So far, so good..");
        }

  }

    @Override
    public void keyTyped(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void keyReleased(KeyEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

};

I think the Key arrow down is 1005. I've so far wrote System.out.println("So far, so good.."); to see if the app even detects it when I press the down arrow key, but it doesn't...

我认为向下的关键箭头是 1005。到目前为止,我已经写了 System.out.println("So far, so good.."); 查看应用程序是否在我按下向下箭头键时检测到它,但它没有...

Any ideas please?

请问有什么想法吗?

采纳答案by Xyene

I'm just throwing this out there because I think it MAY be useful to you, this is a virtual Java keyboard, modified from some resource I found on the web years ago and which I no longer remember the link to:

我只是把它扔在那里,因为我认为它可能对你有用,这是一个虚拟的 Java 键盘,从我几年前在网上找到的一些资源修改而来,我不再记得链接到:

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

public class Keyboard {


    public void main (String[] args) throws InterruptedException {
        while(true) {
        type("

");
        }
    }


    private static Robot robot;
    static Random rand = new Random();

    public Keyboard() throws AWTException {
        this.robot = new Robot();
    }
    public Keyboard(Robot robot) {
        this.robot = robot;
    }
    public void type(CharSequence characters) throws InterruptedException {
        int length = characters.length();
        for (int i = 0; i < length; i++) {
                char character = characters.charAt(i);
                type(character);                

        }

         robot.keyPress(KeyEvent.VK_ENTER);
         robot.keyRelease(KeyEvent.VK_ENTER);
    }

    public void type(char character) {
        switch (character) {
        case 'a': doType(KeyEvent.VK_A); break;
        case 'b': doType(KeyEvent.VK_B); break;
        case 'c': doType(KeyEvent.VK_C); break;
        case 'd': doType(KeyEvent.VK_D); break;
        case 'e': doType(KeyEvent.VK_E); break;
        case 'f': doType(KeyEvent.VK_F); break;
        case 'g': doType(KeyEvent.VK_G); break;
        case 'h': doType(KeyEvent.VK_H); break;
        case 'i': doType(KeyEvent.VK_I); break;
        case 'j': doType(KeyEvent.VK_J); break;
        case 'k': doType(KeyEvent.VK_K); break;
        case 'l': doType(KeyEvent.VK_L); break;
        case 'm': doType(KeyEvent.VK_M); break;
        case 'n': doType(KeyEvent.VK_N); break;
        case 'o': doType(KeyEvent.VK_O); break;
        case 'p': doType(KeyEvent.VK_P); break;
        case 'q': doType(KeyEvent.VK_Q); break;
        case 'r': doType(KeyEvent.VK_R); break;
        case 's': doType(KeyEvent.VK_S); break;
        case 't': doType(KeyEvent.VK_T); break;
        case 'u': doType(KeyEvent.VK_U); break;
        case 'v': doType(KeyEvent.VK_V); break;
        case 'w': doType(KeyEvent.VK_W); break;
        case 'x': doType(KeyEvent.VK_X); break;
        case 'y': doType(KeyEvent.VK_Y); break;
        case 'z': doType(KeyEvent.VK_Z); break;
        case 'A': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_A); break;
        case 'B': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_B); break;
        case 'C': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_C); break;
        case 'D': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_D); break;
        case 'E': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_E); break;
        case 'F': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_F); break;
        case 'G': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_G); break;
        case 'H': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_H); break;
        case 'I': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_I); break;
        case 'J': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_J); break;
        case 'K': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_K); break;
        case 'L': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_L); break;
        case 'M': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_M); break;
        case 'N': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_N); break;
        case 'O': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_O); break;
        case 'P': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_P); break;
        case 'Q': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Q); break;
        case 'R': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_R); break;
        case 'S': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_S); break;
        case 'T': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_T); break;
        case 'U': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_U); break;
        case 'V': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_V); break;
        case 'W': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_W); break;
        case 'X': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_X); break;
        case 'Y': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Y); break;
        case 'Z': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_Z); break;
        case '`': doType(KeyEvent.VK_BACK_QUOTE); break;
        case '0': doType(KeyEvent.VK_0); break;
        case '1': doType(KeyEvent.VK_1); break;
        case '2': doType(KeyEvent.VK_2); break;
        case '3': doType(KeyEvent.VK_3); break;
        case '4': doType(KeyEvent.VK_4); break;
        case '5': doType(KeyEvent.VK_5); break;
        case '6': doType(KeyEvent.VK_6); break;
        case '7': doType(KeyEvent.VK_7); break;
        case '8': doType(KeyEvent.VK_8); break;
        case '9': doType(KeyEvent.VK_9); break;
        case '-': doType(KeyEvent.VK_MINUS); break;
        case '=': doType(KeyEvent.VK_EQUALS); break;
        case '~': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_QUOTE); break;
        case '!': doType(KeyEvent.VK_EXCLAMATION_MARK); break;
        case '@': doType(KeyEvent.VK_AT); break;
        case '#': doType(KeyEvent.VK_NUMBER_SIGN); break;
        case '$': doType(KeyEvent.VK_DOLLAR); break;
        case '%': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_5); break;
        case '^': doType(KeyEvent.VK_CIRCUMFLEX); break;
        case '&': doType(KeyEvent.VK_AMPERSAND); break;
        case '*': doType(KeyEvent.VK_ASTERISK); break;
        case '(': doType(KeyEvent.VK_LEFT_PARENTHESIS); break;
        case ')': doType(KeyEvent.VK_RIGHT_PARENTHESIS); break;
        case '_': doType(KeyEvent.VK_UNDERSCORE); break;
        case '+': doType(KeyEvent.VK_PLUS); break;
        case '\t': doType(KeyEvent.VK_TAB); break;
        case '\n': doType(KeyEvent.VK_ENTER); break;
        case '[': doType(KeyEvent.VK_OPEN_BRACKET); break;
        case ']': doType(KeyEvent.VK_CLOSE_BRACKET); break;
        case '\': doType(KeyEvent.VK_BACK_SLASH); break;
        case '{': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_OPEN_BRACKET); break;
        case '}': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_CLOSE_BRACKET); break;
        case '|': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_BACK_SLASH); break;
        case ';': doType(KeyEvent.VK_SEMICOLON); break;
        case ':': doType(KeyEvent.VK_COLON); break;
        case '\'': doType(KeyEvent.VK_QUOTE); break;
        case '"': doType(KeyEvent.VK_QUOTEDBL); break;
        case ',': doType(KeyEvent.VK_COMMA); break;
        case '<': doType(KeyEvent.VK_LESS); break;
        case '.': doType(KeyEvent.VK_PERIOD); break;
        case '>': doType(KeyEvent.VK_GREATER); break;
        case '/': doType(KeyEvent.VK_SLASH); break;
        case '?': doType(KeyEvent.VK_SHIFT, KeyEvent.VK_SLASH); break;
        case ' ': doType(KeyEvent.VK_SPACE); break;
        default:
                throw new IllegalArgumentException("Cannot type character " + character);
        }
    }

    private static void doType(int... keyCodes) {
        doType(keyCodes, 0, keyCodes.length);
    }

    private static void doType(int[] keyCodes, int offset, int length) {
        if (length == 0) {
                return;
        }

        robot.keyPress(keyCodes[offset]);
        doType(keyCodes, offset + 1, length - 1);
        robot.keyRelease(keyCodes[offset]);
    }

}

To modify this to your needs, you would do:

要根据您的需要修改它,您可以执行以下操作:

for(int i = 0; i != 3; ++i) {
doType(KeyEvent.VK_DOWN);
}

The doType(KeyEvent.VK_DOWN); would press down one time, and then also release it.

doType(KeyEvent.VK_DOWN); 将按下一次,然后也释放它。

You would probably insert that after the "So far, so good..." part in your code.

您可能会在代码中的“到目前为止,很好...”部分之后插入它。

Hope I helped!

希望我有所帮助!

回答by dann.dev

You can use Key Bindings instead. The tutorial is here, direct from the Sun Java tutorials. They are a newer (and I think better) way to do the above.

您可以改用键绑定。教程在这里,直接来自 Sun Java 教程。它们是执行上述操作的更新(我认为更好)的方法。

If you are set on using a key listener then go to this tutorial. It explains how to do it.

如果您开始使用密钥侦听器,请转到本教程。它解释了如何做到这一点。

I have never created a listener the way you are doing it, so not 100% sure what is going wrong but I think it is because you are creating a class to listen for key events, but you need to use that class somewhere else, it doesn't just go. Not sure though.

我从来没有按照你的方式创建过一个监听器,所以不能 100% 确定出了什么问题,但我认为这是因为你正在创建一个类来监听关键事件,但你需要在其他地方使用这个类,它不只是去。虽然不确定。

UPDATE: As above, in the class that uses your key listener, are you adding it? addKeyListener( new MyKeyListener() );

更新:如上所述,在使用您的关键侦听器的类中,您是否添加了它? addKeyListener( new MyKeyListener() );

回答by Ethan McTague

KeyEvent contains key code constants (static int) like VK_DOWN, .VK_A, VK_0, etc. If you are using an IDE like eclipse, it will show you a list as you start typing. Or you can view a complete list in the KeyEvent field summary. This may simplify this kind of coding in your future programs.

KeyEvent 包含关键代码常量(静态整数),如 VK_DOWN、.VK_A、VK_0 等。如果您使用的是Eclipse等 IDE ,它会在您开始输入时显示一个列表。或者,您可以在KeyEvent 字段摘要中查看完整列表。这可能会在您未来的程序中简化这种编码。

public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == e.VK_DOWN){
System.out.println("So far, so good..");
}
}

回答by Rav

To people interested in global event handling I totally recommend my answer originally posted here: How to detect a key press in Java

对于对全局事件处理感兴趣的人,我完全推荐我最初发布在这里的答案: How to detection a key press in Java