我需要找到外部进程打开窗口的GraphicsDevice
(例如物理监视器)。抓住屏幕截图来捕捉WRT旧版本的变化。我们说的是在localhost上运行的应用程序,JS被大量使用。
在我的情况下,我有一个Java进程(基于Selenium)打开一个浏览器窗口,需要抓取它的屏幕截图(使用java.awt.Robot
),不幸的是,打开窗口的显示取决于哪里浏览器记得它是最后一次关闭。
那么,有什么方法可以让我的Java进程找出哪个GraphicsDevice
浏览器窗口被打开了?
答案 0 :(得分:2)
一种(非常粗略)的方法是在调用Desktop.browse()
之前拍摄一个屏幕截图,然后在几分钟之后拍摄另一个屏幕截图。然后将它们与不同的区域进行比较。
如果用户在桌面上有任何动画元素(例如时钟),这可能会被搞砸。
备用路线可能(未经测试)如下。由于您有效地控制了环境和内容,因此可以:
Robot
。如果applet受信任, it 可能会获取屏幕截图并将其写入磁盘(并完全跳过“报告”步骤。)答案 1 :(得分:1)
GraphicsDevice[]
设备可以返回该设备,但是(我从未测试过)如果有专业的GPU Multi GPU Cores
或chaned GPU in SLI Mode
,那么这个Array
是多重播放的,你可以使用SwingX
public static Point getPointForCentering(JInternalFrame window) {
try {
//assert window != null;
Point mousePoint = MouseInfo.getPointerInfo().getLocation();
GraphicsDevice[] devices = GraphicsEnvironment
.getLocalGraphicsEnvironment().getScreenDevices();
for (GraphicsDevice device : devices) {
Rectangle bounds = device.getDefaultConfiguration().
getBounds();
//check to see if the mouse cursor is within these bounds
if (mousePoint.x >= bounds.x && mousePoint.y >= bounds.y &&
mousePoint.x <= (bounds.x + bounds.width) && mousePoint.y
<= (bounds.y + bounds.height)) {
int screenWidth = bounds.width;//this is it
int screenHeight = bounds.height;
int width = window.getWidth();
int height = window.getHeight();
return new Point(((screenWidth - width) / 2) + bounds.x,
((screenHeight - height) / 2) + bounds.y);
}
}
} catch (Exception e) {
LOG.log(Level.FINE, e.getLocalizedMessage() +
" - this can occur do to a Security exception in sandboxed apps");
}
return new Point(0, 0);
}