Tag: awtrobot

awtrobot读取错误的颜色

我正在寻找一种独立于平台的方法来从屏幕上读取颜色,并通过鼠标和键盘操作模拟用户输入。 我以前一直在使用java.awt.robot ,但是在过去的两年中它已经开始在OSX中报告错误的颜色(其他操作系统似乎得到准确的颜色),如本问题所述 。 我正在寻找这个bug的解决方法或任何其他将提供此function的库/语言。 使用下面相当简单的代码可以certificate这个问题。 public void printColorAtCoordinate(int x, int y) { Color color; color = robot.getPixelColor(x, y); System.out.println(“RGB: ” + Integer.toHexString(color.getRGB())); } 它似乎得到了一些正确的颜色,例如0x000000 , 0x0000ff , 0xff0000但不是其他如0x00ff00 ,它报告为ff22ff00 (而不是ff00ff00 )。 大多数颜色至少少量。

具有MAC OS的java.awt.Robot类中的无头环境错误

我试图使用Robot类在我的JavaFX应用程序中捕获屏幕截图, 这是我在我的应用程序中使用的代码: Rectangle screenBounds = new Rectangle(Screen.getPrimary().getBounds().getWidth(), Screen.getPrimary().getBounds().getHeight()); Robot robot = new Robot(); BufferedImage img = robot.createScreenCapture(new java.awt.Rectangle( (int) screenBounds.getX(), (int) screenBounds.getY(), (int) screenBounds.getWidth(), (int) screenBounds.getHeight())); 它在Windows操作系统中运行良好 ,但在Robot robot = new Robot(); MAC OS中显示headless environment的错误Robot robot = new Robot();

java.awt.Robot.waitForIdle()是否等待调度事件?

我正在使用java.awt.Robot进行Swing应用程序的集成测试,但是我无法按正确的顺序运行我的操作。 如何判断调用robot.mousePressed(…)的线程是否阻塞,直到Swing完成调度该事件为止? 显然, robot.setAutoWaitForIdle(true)没有用。 这是我的演示。 我期待“机器人完成!” 消息总是在“动作完成阻止”之后出现,但相反,它经常发生得太快。 import java.awt.AWTException; import java.awt.GraphicsConfiguration; import java.awt.GraphicsDevice; import java.awt.GraphicsEnvironment; import java.awt.Point; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.sql.Date; import java.text.DateFormat; import java.util.logging.ConsoleHandler; import java.util.logging.Formatter; import java.util.logging.LogManager; import java.util.logging.LogRecord; import java.util.logging.Logger; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.WindowConstants; public class RobotWaitForIdleDemo { […]

无效的密钥代码@ java

我正在研究一个用java自动输入内容的系统。 这是我写它的方式: public void typeMessage(String message) { for (char c : message.toCharArray()) { int code = c; if (code > 96 && code < 123) code = code – 32; if (c == '@') { robot.keyPress(VK_SHIFT); robot.keyPress(VK_AT); robot.keyRelease(VK_SHIFT); robot.keyRelease(VK_AT); } else { type(code); } } type(VK_ENTER); } 但是我收到了这个错误: Exception in thread “Thread-2” java.lang.IllegalArgumentException: Invalid key […]

Java Robot鼠标移动:设置速度?

Java Robot类允许移动鼠标,就像移动实际的物理鼠标一样。 但是,如何以人性化(因而不是即时)的方式将鼠标从Point1移动到Point2? 阿卡,如何设定运动速度? 如果Robot类没有这样的速度,那么如果只能实时移动鼠标,那么应该使用什么样的“算法”来模仿人类的鼠标移动? 它应该以一定的递增速度逐像素移动鼠标吗?

用户空闲时间超过10分钟后,Java应用程序会使屏幕显示无响应

我编写了一个Java应用程序,允许用户编写鼠标/键盘输入脚本( JMacro ,链接并不重要,只是为了好奇)。 我个人使用该应用程序在我睡觉的同时在线游戏中自动执行角色动作。 不幸的是,我一直在早上回到电脑前发现它没有反应。 经过进一步测试,我发现我的应用程序导致计算机在大约10分钟的用户空闲时间后无响应(即使应用程序本身模拟用户活动)。 我似乎无法指出这个问题,所以我希望其他人可能会建议在哪里寻找或可能导致问题的原因。 相关症状和特征: 用户闲置10分钟后发生无响应 用户仍然可以在屏幕上移动鼠标指针 除鼠标外的所有内容都显示为冻结…鼠标单击无效,并且没有应用程序更新其显示,包括Windows 7桌面 我让应用程序管理器一起在应用程序中过夜,所以我可以在屏幕冻结之前看到最后一个任务管理器图像… Java应用程序正常CPU /内存使用率和总CPU使用率仅为~1% 移动鼠标后(换句话说,用户从空闲状态返回),屏幕图像在30分钟内再次开始更新(这是非常受欢迎的,有时是10分钟,有时在两小时后没有结果) 用户可以按CTRL-ALT-DEL进入Windows 7的CTRL-ALT-DEL屏幕(暂停30秒后)。 用户仍然可以移动鼠标指针,但单击任何按钮选项会导致屏幕再次冻结 在一些非常罕见的情况下,系统永远不会冻结,我会在早上回到它并充分响应 Java应用程序会在半夜自动停止输入脚本,因此Windows 7检测到“真正的”空闲状态并将显示器转为待机模式……当我醒来时,他们在早上手动移动鼠标时成功退出即使桌面显示仍然显示为冻结 鉴于问题的症状和特征,就好像Java应用程序导致登录用户的桌面显示停止更新,包括任何正在运行的应用程序。 使用的编程概念和Java包: multithreading 标准输出和错误被重新路由到javax.swing.JTextArea 该应用程序使用Swing GUI awt.Robot(非常使用) awt.PointerInfo awt.MouseInfo 系统规格: Windows 7专业版 Java 1.6.0 u17 总之,我应该强调,我不是在寻找任何具体的解决方案,因为我没有提出一个非常具体的问题。 我只是想知道在使用我正在使用的Java库时是否有人遇到过类似的问题。 我也很乐意感谢任何有关尝试进一步查明造成问题的原因的建议。 谢谢! 罗斯 PS,我会发布更新/答案,如果我在继续调试时遇到其他任何事情。 更新:我的应用程序涉及multithreading进程,每个进程初始化自己的Robot对象并异步创建输入事件。 我重构了应用程序只包含一个Robot单例对象,但不同的进程仍然异步调用输入命令。 据我所知,这并没有改变我的应用程序的行为。 我的下一步可能是在Robot单例周围创建一个同步包装器,看看是否有帮助,但鉴于症状,我不知道为什么会这样。

使用java.awt.Robot键入String

我已经知道如何使用java.awt.Robot使用keyPress键入单个字符,如下所示。 如何简单地将整个预定义的String值一次性输入到文本框中? robot.keyPress(KeyEvent.VK_1); robot.keyPress(KeyEvent.VK_1); robot.keyPress(KeyEvent.VK_1); // instead, enter String x = “111”

Java中的屏幕捕获无法捕获整个屏幕

我有一小段代码用于跟踪时间 – 很简单,它每隔四分钟拍摄一次我的桌面照片,以便稍后我可以回过头来看看我白天做的事情 – 它很棒,除非我连接到外部显示器 – 这个代码只拍摄我的笔记本电脑屏幕的屏幕截图,而不是我正在使用的更大的外部显示器 – 任何想法如何更改代码? 我正在运行OSX,以防相关…… import java.awt.AWTException; import java.awt.Robot; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.*; import javax.imageio.ImageIO; class ScreenCapture { public static void main(String args[]) throws AWTException, IOException { // capture the whole screen int i=1000; while(true){ i++; BufferedImage screencapture = new Robot().createScreenCapture( new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) ); // Save […]

Java Robot Class – 将焦点添加到特定的运行应用程序?

我只想弄清楚是否/如何让Java Robot类将焦点从正在运行的java应用程序更改为特定进程,例如ms word或firefox。 谢谢!

获取javaFX 8中节点的屏幕坐标

我正在开发一个Windows 8.1 64位的JavaFX应用程序,带有4GB的RAM,JDK版本为8u45 64bit。 我想使用Robot捕获部分屏幕,但问题是我无法获取我想要捕获的锚定窗格的屏幕坐标,我不想使用snapshot因为输出质量很差。 这是我的代码。 我已经在这个链接中看到了这个问题在JavaFX中 获取 Node的全局坐标,并且这个在javaFX中获得了一个节点的真实位置,我尝试了每个答案,但没有任何工作,图像显示了屏幕的不同部分。 private void capturePane() { try { Bounds bounds = pane.getLayoutBounds(); Point2D coordinates = pane.localToScene(bounds.getMinX(), bounds.getMinY()); int X = (int) coordinates.getX(); int Y = (int) coordinates.getY(); int width = (int) pane.getWidth(); int height = (int) pane.getHeight(); Rectangle screenRect = new Rectangle(X, Y, width, height); BufferedImage capture = […]