仅可见桌面的屏幕截图

时间:2011-10-26 20:14:05

标签: java screenshot jna

我正在使用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.

但我真的不知道如何“模拟”或将 CGRectInfinite CGRectNull 传递给我的JNA代码。我甚至不确定它是不行的方式。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用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();
}