【问题标题】:Java robot keypress "shift" on Mac?Mac上的Java机器人按键“shift”?
【发布时间】:2018-05-15 02:23:39
【问题描述】:

我正在使用内置的 Java 机器人类创建一个自动打字机。我也在 Mac 上构建它,我遇到了一个让我难过的根本缺陷。不管怎样,

“shift”键没有注册。

我试过typerBot.keyPress(KeyEvent.VK_SHIFT); 和一些关键代码,包括typerBot.keyPress(60);

我找遍了整个网络,但我找不到任何东西。

这是一个小示例程序,它复制了我在机器上遇到的问题:

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

public class RobotClass {

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

        try {   //Gives you 5 seconds to click into a suitable environment for the robot to type
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        String text = "AAAAAAAAAA";
        for(char c : text.toCharArray()) {
            RobotClass.typeChar(c);
            Thread.sleep(200);
        }

    }

    public static void typeChar(char c) {

        try {
            Robot typerBot = new Robot();
            switch(c) {
            case 'A':
                typerBot.keyPress(KeyEvent.VK_SHIFT);
                typerBot.keyPress(KeyEvent.VK_A);
                typerBot.keyRelease(KeyEvent.VK_A);
                typerBot.keyRelease(KeyEvent.VK_SHIFT);
                break;
            }
        } catch (AWTException e) {  e.printStackTrace();    }

    }

}

输入:AAAAAAAAAA

输出:aaaaaaaaaa

我的问题:为什么在 mac 上无法识别 shift 键?

【问题讨论】:

  • 代码会很好 - 个人没有遇到问题(最近)
  • 我是这个网站的新手,所以我不确定如何有效地发布代码,但这里就是。我把它缩短到 1 个案例,这样你就可以看到发生了什么。公共类 RobotClass { 公共静态机器人 typerBot; public static void typeCharacter(char c) throws AWTException { typerBot = new Robot();字符键值 = c; typerBot.keyRelease(KeyEvent.VK_SHIFT); switch(keyVal) { case 'A': typerBot.keyPress(KeyEvent.VK_SHIFT); typerBot.keyPress(KeyEvent.VK_A);休息; } } }

标签: java macos keypress shift awtrobot


【解决方案1】:

您必须考虑如何应用按键,记住,您是在“模拟”物理用户。

这意味着,为了能够输入A,您需要按SHIFTA然后松开A SHIFT(或至少在完成后释放 SHIFT

以下是演示整体概念的非常基本的测试。打开文本编辑器,运行程序,您将有 5 秒时间让编辑器进入键盘焦点

Robot bot = new Robot();
bot.setAutoDelay(10);
Thread.sleep(5000);
Map<Character, Integer> mapStrokes = new HashMap<>();
mapStrokes.put('t', KeyEvent.VK_T);
mapStrokes.put('h', KeyEvent.VK_H);
mapStrokes.put('i', KeyEvent.VK_I);
mapStrokes.put('s', KeyEvent.VK_S);
mapStrokes.put(' ', KeyEvent.VK_SPACE);
mapStrokes.put('e', KeyEvent.VK_E);
mapStrokes.put('a', KeyEvent.VK_A);
String text = "This is A test";
for (char value : text.toCharArray()) {
    if (Character.isUpperCase(value)) {
        bot.keyPress(KeyEvent.VK_SHIFT);
    }
    int keyStroke = mapStrokes.get(Character.toLowerCase(value));
    System.out.println("Type " + value);
    bot.keyPress(keyStroke);
    bot.keyRelease(keyStroke);
    if (Character.isUpperCase(value)) {
        bot.keyRelease(KeyEvent.VK_SHIFT);
    }
}

【讨论】:

    【解决方案2】:

    在 switch case 的末尾或相应的“break”之前释放你的 shift 键和按下的字符

    【讨论】:

    • 感谢您的建议,但这也不起作用。为了在我的调试过程中更具体(以及我如何将其缩小到 shift 键),我遵循以下模式:我尝试输入的行是:AAAAAAAAAA 我在代码中编辑的行是:case' A': typerBot.keyPress(KeyEvent.VK_SHIFT); typerBot.keyPress(KeyEvent.VK_A); typerBot.keyRelease(KeyEvent.VK_A); typerBot.keyRelease(KeyEvent.VK_SHIFT);休息;结果是:aaaaaaaaaa
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多