问题标签 [awtrobot]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
97 浏览

java - 记录应用程序两个不同版本之间差异的工具

我需要记录两个不同版本的 Java 程序之间的视觉差异。这包括单击旧版本中的元素,然后单击新版本中的相同元素,并为两者显示不同信息的每个实例截屏并创建错误报告。

有没有可以自动执行此操作的工具?

到目前为止,这是我尝试过的,但我对其他想法持开放态度:

我将两个 Java 程序并排放置,并尝试使用 AutoHotkey 将我的鼠标点击复制到右侧 960 像素,但我有一些不稳定的行为,甚至忽略了我发现它无论如何都不起作用的不稳定行为。

我还尝试使用 Java机器人,因此新版本的应用程序会将鼠标点击复制到右侧 960 像素,但即使是机器人也无法在另一个 Java 窗口中单击。(注意:机器人能够点击 Windows 桌面和其他程序,但不能点击其他 Java 程序。)

0 投票
1 回答
1337 浏览

java - java.awt.Robot:如何将鼠标/键盘事件发送到特定窗口?跨平台支持?

所以从这个问题In Java Swing 你如何获得对窗口的 Win32 窗口句柄 (hwnd) 引用?看来我可以得到 window32 句柄。java.awt.Robot 是否可以将鼠标/键盘事件发送到该窗口句柄?

有时当我通过机器人发送密钥时,如果窗口被最小化,它将开始输入其他打开的与背景无关的窗口。我想通过允许机器人将键和鼠标事件发送到感兴趣的特定窗口来防止这种情况。

是否有可能在 Mac 和 Linux 上实现同样的交易?能够将机器人事件发送到相应的特定窗口句柄吗?

0 投票
1 回答
973 浏览

java - How locate an object coordinates on different screen sizes to click with Java robot?

I am having a problem in locating/ or giving correct coordinates for mouse move and then clicking with Java Robot - (Part of testing project) To elaborate: I need to click an object which is at (100,100) on a screen with the resolution say axb. but I need to reuse the same code dynamically for some other screen resolution - Here I need to provide coordinates of the new screen dynamically.. Any help is appreciated

0 投票
1 回答
119 浏览

java - 屏幕中的 Java 客户端

我需要知道是否使用在后台运行的 Java 程序打开了 Java 客户端。Java 不允许我查看不在同一虚拟机上运行的其他窗口。我认为如果我制作一个 java 程序,打开我想跟踪它的 java 客户端会起作用,但我没有设法做到这一点(尝试了很多)。我的另一个选择是使用java机器人并截取屏幕截图并迭代查找像素信息,直到我匹配我正在寻找的客户端的像素。


客户端是我不应该直接操作的程序,也不是我写的。所以它是第三方的。为了简单起见,假设客户端有一个在红色和绿色之间切换颜色的区域,红色表示问题,绿色表示正常。
在后台运行的程序使用客户端作为触发机制,这意味着如果客户端显示 RED。我不应该做某事,如果它显示为绿色我应该(所以我只需要查找客户端某个位置的颜色是否为红色。

比较:

机器人: -
易于实施?
- 会让用户更加确信我没有窃取他的信息。

在同一个虚拟机中启动两个程序: -更
专业
-我可以跟踪客户端而无需遍历所有窗口的像素
-窗口不会被其他程序“隐藏”
-当窗口移动时,我不必重新迭代再次找到它。

坏:
机器人:
- 迭代可能需要一段时间 -
每次移动 javaclient 时都必须迭代。
在同一个 VM 中启动两个程序:
-程序将需要更多配置,并安装其他“东西”(我想要一些简单快捷的东西)

随意评论效率,其他选项或给我这两个选项的点点滴滴。

谢谢(我决定继续尝试使用 java 而不是 C/C++,因为可能的用户可能运行 Windows 以外的其他操作系统)

0 投票
2 回答
1116 浏览

java - 使用 Java 机器人类。停止程序执行的方法?

我已经多次在 Java 中使用 Robot 类作为处理琐碎任务的快速解决方法。停止执行总是一个问题(在测试过程中需要多次)。我想要的是一个 KeyListener,它将监听一个键/键组合并停止程序。从我的简短阅读来看,您似乎无法在没有框架或类似焦点的情况下嵌入关键听众。对我来说,焦点意味着最前沿的窗口。这是错误的定义吗?如果这是正确的定义,我无法让窗口保持焦点,因为我正带着我的机器人四处爬行。我怎么解决这个问题?

在键入此内容时,我想出了一个不理想的解决方案,即以编程方式使窗口聚焦,测试按键,然后以编程方式使其失焦并继续。这可能吗?有没有更好的办法?

0 投票
1 回答
668 浏览

java - 如何以理想的方式使用 Java BufferedImage 和 Robot 进行内存管理?

我是面向对象编程的新手。我用静态方法创建了一个类,该方法以不同的时间间隔捕获屏幕上各种不同大小的矩形。捕获使用静态 Robot 实例存储在静态 BufferedImage 中:

对数据执行一些操作(包括偶尔将图像写入 bmp 文件)。在下一次捕获时,不需要来自先前捕获的任何图像数据。

由于 bufferedImage 将包含可变大小的数据,直到我的屏幕分辨率的全尺寸,我应该在我的应用程序开始使用它之前声明它吗?

当我重复捕获图像时,这是否会在内存中分配一个可重用的块而没有任何泄漏或效率低下?还是每次我使用 createScreenCapture 方法时都会填充越来越多的内存并简单地为 myStaticBufferedImage 分配一个新指针?

我在 OSX Lion 上运行这个应用程序以及一些 CPU 密集型软件。内存管理的最佳实践是什么?谢谢!

0 投票
1 回答
794 浏览

java - 应该(可以吗?)我重写 Robot 类以通过重复的屏幕捕获来节省内存,还是 GC 足够好?

编辑#2 - 我认为这可能是过度优化,并且会尝试按原样使用 Robot 类,直到遇到问题,但 FWIW:

我正在设计一个应用程序(严格用于 OSX Lion),它与一些 CPU 和内存密集型软件一起运行,包括不应因 CPU 峰值/过载而停止运行的音频软件。像大多数音频软件一样,内存不断被读/写。

createScreenCapture这是一个非常轻量级的应用程序 - 它的主要目的是使用Robot 类的方法在长达几个小时的过程中每分钟捕获一些屏幕截图。

在每个后续的屏幕截图中,不需要前一个屏幕截图。查看Robot源代码后,似乎BufferedImage每次createScreenCapture()调用都会创建一个新的,这意味着前一个是留给垃圾收集的,对吗?

我是 Java 和垃圾收集器的新手。我担心由于 GC 管理/删除这些旧捕获的必要性而导致的 CPU 峰值。理想情况下,图像可以直接从屏幕上每次覆盖内存中的相同区域,并且应用程序的内存占用将保持相当稳定,而 GC 不会工作太多。

尝试扩展 Robot 类并覆盖createScreenCapture()以使其使用相同的静态 BufferedImage 是否可取/可行?如果这行得通,我看不到任何人都以机器人为每次捕获分配新内存的当前方式有任何优势。

谢谢。

编辑#1 - 取自此处的相关机器人源代码如下。看来不仅每次都创建一个新的BufferedImage,而且同样大的int[]、DataBufferInt、WritableRaster。加上 peer.getRGBPixels() 产生的任何开销 - 这似乎连接到图形驱动程序,但我找不到任何来源或信息。我认为不重用相同的内存是浪费的,我错了吗?很明显,使用静态指针不会解决任何问题。BufferedImage 需要使用它自己的 set 方法被覆盖。我对此方法添加了自己的评论,并用$$ 标记。从理论上讲,它会为我的应用程序节省大量 GC 操作,但这是否值得担心?如果我对 java 和 profiling 有更多的了解,我会尝试一切。

0 投票
0 回答
242 浏览

java - awtrobot 读取错误的颜色

我正在寻找一种独立于平台的方式来从屏幕读取颜色并通过鼠标和键盘操作模拟用户输入。我以前一直在使用java.awt.robot,但是在过去的 2 年中,它开始在 OSX 中报告不正确的颜色(其他操作系统似乎获得了准确的颜色),如本问题所述。

我正在寻找解决此错误的方法或任何其他提供此功能的库/语言。

使用下面相当简单的代码可以证明这个问题。

它似乎使某些颜色正确,例如0x000000, 0xffffff, 0x0000ff0xff0000但其他颜色则不正确,例如0x00ff00,它报告为ff22ff00(而不是ff00ff00)。大多数颜色至少有少量偏差。

0 投票
1 回答
1249 浏览

java - Java Swing:可以将机器人键盘输入发送到特定的 JFrame 窗口吗?

我正在使用生成新 JFrame 窗口的第三方 java 库。如何使 java.awt.Robot 在出现时将点击和键盘输入发送到该特定窗口?我会在一个单独的线程中运行它,以便在机器人将输入发送到特定的 JFrame 窗口时,可以在主应用程序上执行其他活动。

请注意,我没有对生成此 JFrame 窗口的进程的 api 访问权限。

目前,当 JFrame 窗口最小化或关闭时,机器人将继续向任何当前可见的 JFrame 窗口发送输入。

0 投票
2 回答
851 浏览

java - 在 Java 中检测 3D 第一人称世界的鼠标移动

我正在使用 Java 开发第一人称游戏,并且正在尝试使 3D 运动正常工作。

我的问题是我想捕捉鼠标移动,但将鼠标保持在窗口内。捕获鼠标移动后,我认为将鼠标保持在窗口中的最佳方法是使用 Robot.moveMouse(x,y) 将鼠标移动后在窗口中居中。这很好用,但是机器人的移动会在我的窗口中触发一个事件,然后将其解释为正常事件,从而在世界上移动我的角色。

我尝试了各种保持状态并忽略运动的方案,直到我处于中心位置,但它们看起来都很挑剔,并且不能完全检测到哪些事件是用户控制的还是机器人控制的。

有没有一种简单的方法来检测鼠标移动来自机器人?

是否有更简单的方法来解决我忽略的问题?