“Java机器人按键”;shift";在Mac上?
我正在使用内置的Java robot类创建一个自动打字机。我还在Mac上构建它,我遇到了一个根本性的缺陷,这让我很难堪。不管怎样 “shift”键不注册 我试过“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
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