Java Mac 上的机器人按键 "shift"?

Java robot keypress "shift" on Mac?

我正在使用内置 Java 机器人 class 创建一个自动打字机。我也在 Mac 上构建它,但我遇到了一个困扰我的基本缺陷。不管怎样,

the "shift" key does not register.

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

我在网上找遍了,但找不到任何东西。

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

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 键?

在 switch case 的末尾或相应的 "break"

之前释放您的 shift 键和按下的字符

您必须考虑如何应用击键,请记住,您是 "simulating" 物理用户。

这意味着,为了能够键入 A,您需要按下 SHIFTA 然后松开 ASHIFT(或至少在完成后释放 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);
    }
}