如何在Windows中使用JNA截屏?

问题描述 投票:2回答:1

我发现了一些代码示例,但是我不知道可以使用哪种JNA版本使用哪些方法。我确实只找到了片段,其中缺少类,因此无法导入它们。

我想知道我应该使用哪个JNA版本以及如何以BufferedImage的形式获取屏幕截图。

所需进口商品的清单也很好。

java c winapi screenshot jna
1个回答
0
投票

看起来好像有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类)。

© www.soinside.com 2019 - 2024. All rights reserved.