如何找到打开外部进程窗口的GraphicsDevice

时间:2011-09-16 12:22:11

标签: java selenium multiple-monitors

我需要找到外部进程打开窗口的GraphicsDevice(例如物理监视器)。抓住屏幕截图来捕捉WRT旧版本的变化。我们说的是在localhost上运行的应用程序,JS被大量使用。

在我的情况下,我有一个Java进程(基于Selenium)打开一个浏览器窗口,需要抓取它的屏幕截图(使用java.awt.Robot),不幸的是,打开窗口的显示取决于哪里浏览器记得它是最后一次关闭。

那么,有什么方法可以让我的Java进程找出哪个GraphicsDevice浏览器窗口被打开了?

2 个答案:

答案 0 :(得分:2)

一种(非常粗略)的方法是在调用Desktop.browse()之前拍摄一个屏幕截图,然后在几分钟之后拍摄另一个屏幕截图。然后将它们与不同的区域进行比较。

如果用户在桌面上有任何动画元素(例如时钟),这可能会被搞砸。


备用路线可能(未经测试)如下。由于您有效地控制了环境和内容,因此可以:

  1. 将“屏幕截图”页面加载到框架文档的框架中。
  2. 在另一个框架中加载小程序。
  3. 让JS确定目标框架的内容区域,并将其报告给applet。 Applet根据自己的位置和内容区域的组合确定屏幕截图区域。
  4. 小程序报告该区域为(沙箱)本地主机或(可信)所需的任何套接字。
  5. 截图应用。使用applet中的信息来控制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);
    }