Java机器人按键在Mac上“转移”?

时间:2018-05-15 02:23:40

标签: java macos keypress shift awtrobot

我正在使用内置的Java机器人类创建自动化的typer。我也是在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键?

2 个答案:

答案 0 :(得分:1)

你必须要考虑如何应用击键,记住,你是“模拟”一个物理用户。

这意味着,为了能够输入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); } } ,您需要按 SHIFT A 然后释放 A < kbd> SHIFT (或者至少在你完成时释放 SHIFT

以下是一个真正基本的测试,展示了整体概念。打开文本编辑器,运行程序,你将有5秒钟让编辑器进入键盘焦点

if read -p "Enter IP1" IP1; then
  sed -i~ -e "s/myip1/${IP1}/g" test.txt
else
  echo Error
fi

答案 1 :(得分:0)

在开关盒末端或相应的“中断”

之前释放换档键和按下的字符