我发现了一些代码示例,但是我不知道可以使用哪种JNA版本使用哪些方法。我确实只找到了片段,其中缺少类,因此无法导入它们。
我想知道我应该使用哪个JNA版本以及如何以BufferedImage
的形式获取屏幕截图。
所需进口商品的清单也很好。
看起来好像有several examples at this link。为了便于讨论,我在下面引用一个(#3),但是您可能会发现其他一个更适合您的情况的示例,希望这个答案可以帮助您理解该过程。
在示例之前,我将回答您的问题“哪些JNA版本” ...您几乎在所有情况下都应使用最新版本。 JNA是一个用户支持的库,并且核心JNA代码没有太大变化,但是每个新版本都向本机函数添加了更多用户贡献的映射。注意他们的FAQ问题"JNA is missing function XXX in its platform library mappings"和答案,“不,不是,它只是在等您添加它:)”。如果您需要的映射不在JNA中,则可以使用提供的示例将其添加,以满足您的即时需求。更好的是,将映射贡献给JNA项目,以便您所处的下一个人将从您所做的工作中受益!
现在,链接中的示例3将截取整个屏幕的屏幕快照,并将其作为BufferedImage
对象返回。
public BufferedImage getScreenshot() {
final HANDLE oldBitmap = GDI.SelectObject( blitDC, outputBitmap );
try {
GDI.BitBlt( blitDC, 0, 0, screenArea.width, screenArea.height, windowDC, screenArea.x, screenArea.y, GDI32.SRCCOPY );
} finally {
GDI.SelectObject( blitDC, oldBitmap );
}
final boolean ok = GDI.GetDIBits( blitDC, outputBitmap, 0, screenArea.height, (byte[]) null, bi, WinGDI.DIB_RGB_COLORS );
if ( ok ) {
final BITMAPINFOHEADER bih = bi.bmiHeader;
bih.biHeight = -Math.abs( bih.biHeight );
bih.biCompression = 0;
return bufferedImageFromBitmap( blitDC, outputBitmap );
}
else
return null;
}
The full source code对于该示例显示您将需要通过其实例JNA's WinGDI class访问的所有导入,大部分来自private static final GDI32 GDI = GDI32.INSTANCE;
。如果滚动到该类的底部,您可能还会看到作者使用JNA中没有的映射扩展了两个JNA平台接口贡献。您将必须执行类似的映射(并在完成后将它们贡献给各自的JNA类)。