【发布时间】: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.
但我真的不知道如何“模拟”或将 CGRectInfinite 或 CGRectNull 传递给我的 JNA 代码。我什至不确定这是要走的路。
【问题讨论】:
标签: java screenshot jna