我正在使用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代码。我甚至不确定它是不行的方式。
答案 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();
}