【问题标题】:Screenshot of only the visible desktop仅可见桌面的屏幕截图
【发布时间】:2012-12-13 17:09:14
【问题描述】:

我正在使用 JNA / CGWindowListCreateImage 在 OS X 系统上截屏。

代码主要取自这个问题:

Invalid memory access of location with Rococoa

我的问题是,尽管它“有效”,但它确实需要整个桌面的副本,其大小取决于其他窗口的位置(例如,如果另一个窗口部分在屏幕上,那么 不是在屏幕上将有助于使“桌面”屏幕截图更大)。

所以在 1680x1050 上我得到“桌面截图”(嗯,不是真的),可以是 1714x1084 像素等。

我认为通过正确的原点/边界我的问题会消失,但我不知道如何获取该信息,尤其是不使用 JNA。

这基本上是我所拥有的:

final int windowIdDesktop = 0;

QuartzLibrary.CGRect bounds = new QuartzLibrary.CGRect.CGRectByValue();
bounds.origin = new QuartzLibrary.CGPoint();
bounds.origin.x = 0;
bounds.origin.y = 0;
bounds.size = new QuartzLibrary.CGSize();
bounds.size.width = 0;
bounds.size.height = 0;
ID imageRef = QuartzLibrary.INSTANCE.CGWindowListCreateImage(bounds,QuartzLibrary.kCGWindowListOptionOnScreenOnly, windowIdDesktop, QuartzLibrary.kCGWindowImageDefault);

显然有人遇到同样的问题,但在 Objective-C 中,使用以下技术来计算正确的边界:

档案的好处以及遇到类似问题的任何其他人, 这是我计算边界框的方法:

NSRect desktopRect = NSZeroRect; for (NSScreen *screen in [NSScreen screens]) { desktopRect = NSUnionRect(desktopRect, [screen frame]); }

为什么这是必要的,我如何将其转换为 JNA?我只需要知道屏幕可见部分的来源是什么(至少我是这么认为的)

CGWindowListCreateImage 声明如下:

Setting
   `screenBounds' to `CGRectInfinite' will include all the windows on the
   entire desktop. Setting `screenBounds' to `CGRectNull' will use the
   bounding box of the specified windows as the screen space rectangle.

但我真的不知道如何“模拟”或将 CGRectInfiniteCGRectNull 传递给我的 JNA 代码。我什至不确定这是要走的路。

【问题讨论】:

    标签: java screenshot jna


    【解决方案1】:

    您是否尝试过简单地使用 Java 提供的方法来获取显示大小? Java 提供以下内容(用于单个显示):

    // Get the size of the default display
    Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    

    如果有多个显示器可用,则获取每个显示器的大小:

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gs = ge.getScreenDevices();
    
    // Get size of each display
    for (int i=0; i<gs.length; i++) {
        DisplayMode dm = gs[i].getDisplayMode();
        int screenWidth = dm.getWidth();
        int screenHeight = dm.getHeight();
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多