首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在Windows中使用JNA截图?

在 Windows 中使用 JNA(Java Native Access)进行截图,可以通过调用 Windows API 来实现。以下是一个详细的步骤和示例代码,展示如何使用 JNA 截图。

步骤

  1. 添加 JNA 依赖
    • 如果你使用的是 Maven 项目,可以在 pom.xml 文件中添加 JNA 依赖:<dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>5.8.0</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>5.8.0</version> </dependency>
  2. 定义 Windows API 接口
    • 使用 JNA 定义需要调用的 Windows API 函数和结构体。
  3. 实现截图功能
    • 调用 Windows API 函数来捕获屏幕并保存为图像文件。

示例代码

以下是一个完整的示例代码,展示如何使用 JNA 截图:

代码语言:javascript
复制
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.GDI32;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinGDI;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.ptr.PointerByReference;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class JNAScreenshot {

    public static void main(String[] args) {
        try {
            BufferedImage screenshot = captureScreen();
            ImageIO.write(screenshot, "png", new File("screenshot.png"));
            System.out.println("Screenshot saved as screenshot.png");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static BufferedImage captureScreen() {
        User32 user32 = User32.INSTANCE;
        GDI32 gdi32 = GDI32.INSTANCE;

        WinDef.HWND hwnd = user32.GetDesktopWindow();
        WinDef.HDC hdcWindow = user32.GetDC(hwnd);
        WinDef.HDC hdcMemDC = gdi32.CreateCompatibleDC(hdcWindow);

        WinDef.RECT bounds = new WinDef.RECT();
        user32.GetWindowRect(hwnd, bounds);

        int width = bounds.right - bounds.left;
        int height = bounds.bottom - bounds.top;

        WinDef.HBITMAP hBitmap = gdi32.CreateCompatibleBitmap(hdcWindow, width, height);
        WinNT.HANDLE hOld = gdi32.SelectObject(hdcMemDC, hBitmap);

        gdi32.BitBlt(hdcMemDC, 0, 0, width, height, hdcWindow, 0, 0, WinGDI.SRCCOPY);

        gdi32.SelectObject(hdcMemDC, hOld);
        gdi32.DeleteDC(hdcMemDC);
        user32.ReleaseDC(hwnd, hdcWindow);

        BufferedImage image = getBufferedImageFromBitmap(hBitmap);
        gdi32.DeleteObject(hBitmap);

        return image;
    }

    private static BufferedImage getBufferedImageFromBitmap(WinDef.HBITMAP hBitmap) {
        GDI32 gdi32 = GDI32.INSTANCE;
        WinGDI.BITMAPINFO bmi = new WinGDI.BITMAPINFO();
        bmi.bmiHeader.biSize = new WinDef.DWORD(bmi.bmiHeader.size());
        bmi.bmiHeader.biWidth = 0;
        bmi.bmiHeader.biHeight = 0;
        bmi.bmiHeader.biPlanes = 1;
        bmi.bmiHeader.biBitCount = 32;
        bmi.bmiHeader.biCompression = WinGDI.BI_RGB;

        PointerByReference pBits = new PointerByReference();
        gdi32.GetDIBits(null, hBitmap, 0, 0, null, bmi, WinGDI.DIB_RGB_COLORS);

        bmi.bmiHeader.biHeight = -bmi.bmiHeader.biHeight; // Flip the image vertically

        BufferedImage image = new BufferedImage(bmi.bmiHeader.biWidth, Math.abs(bmi.bmiHeader.biHeight), BufferedImage.TYPE_INT_RGB);
        gdi32.GetDIBits(null, hBitmap, 0, image.getHeight(), image.getRaster().getDataBuffer(), bmi, WinGDI.DIB_RGB_COLORS);

        return image;
    }
}

解释

  1. 添加依赖
    • 确保在项目中添加了 JNA 和 JNA Platform 的依赖。
  2. 定义 Windows API 接口
    • 使用 JNA 提供的 User32GDI32 接口来调用 Windows API 函数。
  3. 实现截图功能
    • 获取桌面窗口的句柄。
    • 创建兼容的设备上下文(DC)。
    • 获取屏幕的尺寸。
    • 创建兼容的位图并将屏幕内容复制到位图中。
    • 将位图转换为 BufferedImage
    • 保存 BufferedImage 为图像文件。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

公式识别神器Mathpix for matlab 1.0.0版正式发布

小编开发这些科研小工具仅仅是个爱好而言,并希望这些小工具能给需要它的人带来便利,小编会一既往地为大家开发分享更多有用地科研小工具。...说时容易做时难,因为小编决定模仿官方版本来做,第一个难题就是如何在matlab实现全屏幕自由截图,这个要用纯matlab实现几乎是不太现实,考虑到Java是matlab的老祖宗,决定从Java入手,通过查询网上相关代码并加上小编自己优化最后终于解决截图的这个问题...小编还准备在官方版本的模式上再升华一下,添加图片读取识别与拖拽导入识别,相对截图,这俩实现起来容易些,其中拖拽导入部分使用前人的优秀成果。...由于全局截图用到了Java,因此在安装运行之前建议先配置好Java环境(需要jre1.8及以上版本),步骤如下: ① 将jintellitype-1.3.9.jar、jna-5.4.0.jar、jna-platform...-5.4.0.jar复制到 Java安装目录\jre\lib 目录下 ② 如果是win32操作系统,就将dll的JIntellitype32.dll复制到C:\Windows\System32目录下

1.8K20

何在Windows运行bash

首先,需要获得Windows10的build 14316。...Windows10会进行确认,是否安装bash内测版,并在运行Linux子系统之前执行安装程序。 完成这些不怎么愉快的步骤之后,就可以在Windows上面使用Bash了。...不过毕竟是内测版本,还存在很多bug:使用top命令会使整个系统死机,使用apt-get安装emacs会在成功之前挂起一次。但是总体来说,作为早期的测试版本还是比较出色的。...微软承诺将在以后修复这个bug,这样用户就会以用户的权限登录,可以使用sudo命令获取超级用户的权限。 在整合开源生态系统的开发工具方面,微软要做的还有很多。...微软计划将来在Windows上支持更多的shell,这样其他像csh等shell的粉丝也能在Windows上工作了。 有趣的是,倍受欢迎的PowerShell脚本工具或将登录Linux。

3.5K80
  • 何在Windows使用NCL

    同时,随着NCL多个版本的优化,NCL提供了大量优秀的函数,来帮助使用者快速熟悉并使用气象和海洋中常用的统计方法。虽然现在NCL在向python转移,但是短时间内NCL依旧不会过时。...现在,大家在Windows下运行NCL,目前主要分为3种方法: (1)cywin(2)虚拟机(3)WSL(Windows Subsystem for Linux)。...控制面板->程序->启用或关闭Windows功能 打开 适用于Linux的Windows子系统 选项,确定 ?...因为是在Windows界面下操作,所以可以直接使用解压缩的软件直接解压缩,放入一个指定的文件夹。如下图: ?...在根目录下,找到.bashrc文件(直接cd就能进入该文件夹),进行编辑,将下列路径添加入到该文件即可。

    4K31

    何在Linux搭建Windows环境

    前言 众所周知,搭建网站最好用是Linux系统,但是有一些Windows软件没法运行在Linux服务器上,就很痛苦 经过我千辛万苦的寻找,我终于找到可以在Linux上运行的Windows环境了 虽然版本比较老...,功能也很少,但是能够勉强运行大部分Windows软件,比如QQ机器人、自动运行的小软件等\ 成果展示 教程 建议安装宝塔面板,如果实在无法安装宝塔面板又想拥有Windows环境的话也可以,但是一定要仔细看教程...一、宝塔面板下安装教程 1、安装环境 宝塔面板-软件商店安装 Docker管理器 2、开始搭建 (1)第一步 安装镜像文件,在终端ssh输入以下指令 海外服务器 ssh输入 docker pull...二、非宝塔面板下安装教程 1、安装Docker 如果你没法安装宝塔面板,那就直接在ssh输入以下代码安装Docker 安装命令: yum install -y git docker wget 也可以使用国内...为VNC(远程桌面)连接密码,必填 其中 VNC_SCREEN 为VNC(远程桌面)分辨率,必填 其中 8080 为VNC(远程桌面)端口 其中 /bot/ 为虚拟机在当前服务器映射的目录 启动后可以使用

    1.4K30

    Pulumi 如何在 Windows 环境设置

    Pulumi 是使用 go 语言进行编写的。 在 Windows 环境下的安装和配置与 Maven 是一样的。 没有安装文件, Pulumi 没有安装文件,所以你不能按照下载后安装的方式来进行配置。...解压设置环境变量 你可以将这个 zip 文件解压到任何你希望的文件夹。 例如,我们是将这个文件解压到: C:\Dkits\Pulumi 随后,你需要在环境变量中进行设置。...随后,不要忘记将这个设置好的环境变量添加到 PATH ,如果不这样的话,你就没有办法执行 pulumi 这个命令行工具。 这个命令行工具是 pulumi 需要的,因此必须在 Path 。...校验安装 在完成上面所有的设置步骤后,可以在 Windows 的控制台中执行命令 pulumi version 来校验安装。 如果能够看到显示的版本号,则表示安装已经完成了。...https://www.ossez.com/t/pulumi-windows/13483

    1.9K30

    工作经验|如何在工作优雅的截图

    Snipaste是一款轻巧、易于使用截图工具,它可以快速截取屏幕上的任何区域,并提供了多种标注和编辑功能,并将截图粘贴到任何应用程序。...跨平台:它不仅适用于Windows操作系统,还可以在MacOS、Linux等平台上使用。自动识别:Snipaste能够自动识别并提取屏幕上的文字和图像,方便用户进行搜索和识别。...Windows为彩色,其实我还是比较喜欢这个颜色。3.2 截取屏幕在MacOS截图的快捷键是fn+F1。而在Windows通过单击Snipaste图标,选择“全屏”或“选区”选项进行截图。...3.3 截图编辑(标注)在截图完成后,用户可以对截图进行编辑,裁剪、缩放、旋转等。在编辑完成后,可以选择将截图保存到本地或复制到剪贴板。...通过使用Snipaste,用户可以更加高效地进行截图操作,并且能够更加方便地将截图应用到日常工作和生活。我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

    26140

    何在idea运行一个java程序_截图工具运行不了

    博客来源于项目以及编程遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!...吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里… ☕️ 本篇超级详细案例截图教学 IDEA如何运行SpringBoot项目,图片点击可放大仔细看 ☕️Java编译工具以及环境准备: IDEA...characterEncoding=utf-8&serverTimezone=UTC username: root password: root 备注:如果登录不上 请先排除数据库连接问题 ---- 初始化数据 使用数据库连接工具先连接...MySQL,连接后,右键新建数据库(我使用的是Navicat) 名称务必保持和自己配置文件的名称一致 将我们的sql文件复制到新建的查询里面,点击运行即可 ---- 运行项目...发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.1K30

    何在 Windows 11 禁用锁定屏幕更新

    何在 Windows 11 禁用锁定屏幕 在更新到 Windows 11 之后,在 Windows 10 下对 Windows 注册表文件进行的许多调整仍然存在,但是,许多其他调整已恢复为默认设置。...这就是为什么我们必须重新审视在 Windows 11 禁用锁定屏幕所需的过程。 免责声明:编辑 Windows 注册表文件是一项严肃的工作。...损坏的 Windows 注册表文件可能会导致您的计算机无法运行,需要重新安装 Windows 操作系统并可能丢失数据。在继续之前备份 Windows 注册表文件并创建一个有效的还原点。...要在 Windows 11 注册表文件中进行编辑,我们将在 Windows 11 搜索工具中键入“regedit”。从结果,选择 Regedit 应用程序,然后使用左侧窗口导航到该键(图 A)。...参见:Windows 徽标键盘快捷键:完整列表(TechRepublic) 如果您想将 Windows 11 锁定屏幕添加回您的设置,只需再次编辑 Windows 注册表文件并将 NoLockScreen

    2.3K30

    何在Windows安装多个python解释器

    windows10系统下安装两个不同版本的的python解释器,在通常情况下编译执行文件都是没问题的,但是加载或下载包的时候pip的使用就会出现问题,无法下载一直报错 ​仅对cpython有效 一、virtualenvwrapper-win...virtualenvwrapper-win pip install virtualenvwrapper-win ​注:此时电脑中只能存在一个python解释器,因为多个解释器会出现pip冲突,导致pip无法使用...、退出虚拟环境命令:deactivate ​这个是在虚拟环境中使用的,用来退出虚拟环境的命令 deactivate 10、查看当前存在的所有虚拟环境 ​查看命令:workon 或 lsvirtualenv...​可以通过这两个命令来查看当前存在的所有虚拟环境,单个使用,其中的任何一个都可以 复制代码 代码如下: workonlsvirtualenv 11、进入某个虚拟环境 ​进入某个虚拟环境的命令:workon...(3)在pip文件夹创建一个名为pip.ini的文件,使用记事本或notepadd++等软件打开,在里面复制如下内容: [global] timeout = 6000 index-url = https

    2.4K30

    何在 Windows使用 ONLYOFFICE 协作编辑文档

    总的思路就是比如在局域网的某台windows电脑上安装docker容器来运行ONLYOFFICE Document Server,然后运行EngineerCMS来调用ONLYOFFICE Document...,Word也有;QQ拼音输入法按空格不能输出汉字,(5.1.2新版已经解决这个问题)搜狗输入法可以;字体/样式选择里显示的是英文,不是汉字(用ps修改一下图片即可);打开文档默认文字检查都是打开的,新版...下载地址http://get.daocloud.io/,下载支持旧版windows的docker toolbox,win10就直接下载docker了。...(2)docker toolbox访问前要按照第7节的方法设置宿主机(安装docker的电脑)virtualbox的端口转发。win10的windows docker不用设置端口转发了。...这时只能在你自己的机器上访问,同一个局域网的其他机器是不能访问的,原因是:Windows上的docker是运行在一个虚拟机里面的,看官方给的图:  要让别的机器也访问到,需要配置一下虚拟机。

    3.2K20

    何在Windows10上使用Linux系统?

    开启WSL 打开控制面板,如下图,然后点击Programs 弹出如下图,点击Program and Features 在弹出的界面,点击左边的Turn Windows feature on or...off 然后在弹出的界面, 勾选Windows Subsystem for Linux 等待配置完成,需要重启windows,使配置生效。...安装Linux 重启windows后,打开Microsoft Store(微软商店),如下图,然后再搜索框搜索WSL。...超级工具Cmder windows自带的cmd窗口,丑,难用, 开源项目Cmder工具可以完美的替换windows自带的cmd工具,而且还可以像操作linux一样操作windows,如果你习惯了使用linux...命令,可以在Cmder里面使用linux命令,来操作windows,比如linux系统下用ls列出当前文件夹下面的所有文件,而windows下需要用dir, 使用Cmder工具,你可以在windows使用

    5.4K20
    领券