“Java机器人按键”;shift";在Mac上?

“Java机器人按键”;shift";在Mac上?,java,macos,keypress,shift,awtrobot,Java,Macos,Keypress,Shift,Awtrobot,我正在使用内置的Java robot类创建一个自动打字机。我还在Mac上构建它,我遇到了一个根本性的缺陷,这让我很难堪。不管怎样 “shift”键不注册 我试过typerBot.keyPress(KeyEvent.VK\u SHIFT)和一些按键代码,包括打字机按键(60) 我在网上找遍了,什么也找不到 下面是一个小示例程序,它复制了我在机器上遇到的问题: import java.awt.AWTException; import java.awt.Robot; import java.awt.e

我正在使用内置的Java robot类创建一个自动打字机。我还在Mac上构建它,我遇到了一个根本性的缺陷,这让我很难堪。不管怎样

“shift”键不注册

我试过
typerBot.keyPress(KeyEvent.VK\u SHIFT)
和一些按键代码,包括
打字机按键(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();    }

    }

}
输入:
aaaaaaaa

输出:
aaaaaaaa


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

在开关盒的末尾或相应的“中断”之前释放shift键和按下的字符。

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

这意味着,为了能够键入
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);
    }
}
Robot bot=新机器人();
bot.setAutoDelay(10);
睡眠(5000);
Map mapStrokes=新建HashMap();
mapstrookes.put('t',KeyEvent.VK\u t);
mapstrooks.put('h',KeyEvent.VK_h);
mapstrooks.put('i',KeyEvent.VK_i);
mapStrokes.put('s',KeyEvent.VK_s);
mapStrokes.put(“”,KeyEvent.VK_空间);
mapstrooks.put('e',KeyEvent.VK_e);
mapstrooks.put('a',KeyEvent.VK_a);
String text=“这是一个测试”;
for(字符值:text.toCharArray()){
if(字符.isUpperCase(值)){
bot.keyPress(KeyEvent.VK_SHIFT);
}
int keyStroke=mapstrooke.get(Character.toLowerCase(value));
系统输出打印项次(“类型”+值);
机器人按键(击键);
按键释放(击键);
if(字符.isUpperCase(值)){
bot.keyrease(KeyEvent.VK_SHIFT);
}
}

code会很好-我个人(最近)没有遇到过这个问题。我是这个网站的新手,所以我不知道如何有效地发布代码,但这里就是。我把它缩短为一箱,这样你就可以看到发生了什么。public类RobotClass{public static Robot typerBot;public static void typeCharacter(char c)抛出AWTException{typerBot=new Robot();char keyVal=c;typerBot.keyrease(KeyEvent.VK_SHIFT);switch(keyVal){case'A':typerBot keyppress(KeyEvent.VK_SHIFT);typerBot.keyppress(KeyEvent.VK_A);break;}}谢谢你的建议,但这也不起作用。更具体地说,在我的调试过程中(以及如何将其缩小到shift键),我遵循以下模式:我尝试键入的行是:AAAAAAAAAA我在代码中编辑的行是:case'A':typerBot.keyPress(KeyEvent.VK_shift);键盘按键(KeyEvent.VK_A);typerBot.keyRelease(KeyEvent.VK_A);类型RBOT.keyRelease(KeyEvent.VK_SHIFT);打破结果是:AAAAA