Java Robot类按键异常:宝可梦刷闪光脚本仅触发一次按键
宝可梦闪光刷取脚本Jar运行异常问题分析
闲时启动了一个小项目,近期回归宝可梦游戏并捕获了第一只闪光宝可梦(颜色反转的稀有宝可梦),为批量刷闪光宝可梦开发了如下Java脚本:
import java.awt.Color; import java.awt.Robot; import java.util.concurrent.TimeUnit; import javax.swing.JFrame; import javax.swing.JOptionPane; public class App { public static void main(String[] args) throws Exception { JFrame f = new JFrame(); String name=JOptionPane.showInputDialog(f,"Enter Name"); if (name.equals("go")){ Redo(); } } public static void Redo()throws Exception { Robot robot = new Robot(); robot.delay(5000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); robot.delay(3000); robot.keyPress(10); check(); } public static void check() throws Exception{ Robot robot2 = new Robot(); Color color2 = new Color(255,255,185); Color color = robot2.getPixelColor(1080, 446); if ( color.equals(color2)==true){ // System.out.println("shiny found!"); System.exit(0); } else{ robot2.keyPress(123); // System.out.println("no shiny "); Redo(); } } }
脚本预期
输入"go"后切换到游戏窗口,Robot模拟多次Enter键进入战斗,check方法检测指定坐标(1080,446)的像素颜色,匹配闪光特征色(255,255,185)则退出程序,否则按F12重启循环。
问题现象
IDE测试正常,但打包成Jar运行时,游戏仅识别一次Enter键,约15秒后触发F12重启。
问题根源及解决方案
核心问题:缺少keyRelease调用
AWT的Robot.keyPress()仅负责按下按键,必须配对调用keyRelease()才能完成一次完整的按键输入。IDE调试环境可能存在隐式的按键释放逻辑,但Jar包独立运行时没有这个补充,导致第一次keyPress(10)后Enter键一直处于按下状态,游戏只会识别第一次按下动作,后续重复的keyPress(10)不会被判定为新的按键输入。
修复后的代码
import java.awt.Color; import java.awt.Robot; import javax.swing.JFrame; import javax.swing.JOptionPane; public class App { // 复用Robot实例,避免重复创建 private static final Robot ROBOT; static { try { ROBOT = new Robot(); } catch (Exception e) { throw new RuntimeException("初始化Robot失败", e); } } public static void main(String[] args) { JFrame f = new JFrame(); String name = JOptionPane.showInputDialog(f, "Enter Name"); if ("go".equals(name)) { startShinyHunt(); } f.dispose(); // 关闭输入窗口,避免后台残留 } public static void startShinyHunt() { try { // 等待5秒切换到游戏窗口 ROBOT.delay(5000); // 模拟9次完整的Enter按键操作 for (int i = 0; i < 9; i++) { pressAndReleaseKey(10); // Enter键码 ROBOT.delay(3000); } checkForShiny(); } catch (Exception e) { e.printStackTrace(); } } private static void checkForShiny() { Color targetColor = new Color(255, 255, 185); Color currentColor = ROBOT.getPixelColor(1080, 446); if (targetColor.equals(currentColor)) { System.exit(0); } else { // 完整触发F12按键 pressAndReleaseKey(123); // 重启狩猎流程 startShinyHunt(); } } // 封装完整的按键按下+释放逻辑 private static void pressAndReleaseKey(int keyCode) { ROBOT.keyPress(keyCode); ROBOT.delay(50); // 模拟真实按键的按下时长,提升兼容性 ROBOT.keyRelease(keyCode); } }
额外注意事项
- 权限问题:Jar运行时需确保拥有系统级输入模拟权限,Windows下建议以管理员身份运行,Mac需在「系统设置-隐私与安全性」中授予辅助功能权限。
- 窗口焦点:必须在
delay(5000)的时间内将游戏窗口切换为前台活跃窗口,否则Robot的输入会发送到其他窗口。 - 坐标准确性:游戏分辨率、窗口缩放比例变化会导致目标像素坐标偏移,需重新确认闪光特征对应的坐标位置。
内容的提问来源于stack exchange,提问作者Jubs Eest
相关产品推荐
相关产品推荐

