1. 前言
虽说有系统自带截屏(PrtScr
),但还是想着如何用代码自己实现一个。
于是乎,便在网上找了个简单例子,然后落地实践。
2. 截屏小例
先说说大概思路:
-
- 使用第三方包
JIntellitype
注册全局热键;
- 使用第三方包
-
- 使用
JDK
提供的Robot
实现截屏;
- 使用
先准备JIntellitype
的两个dll
: JIntellitype.dll
和 JIntellitype64.dll
官方Git仓库:https://github.com/melloware/jintellitype
传送门
两个dll所在仓库位置:jintellitype/src/main/resources/com/melloware/jintellitype/windows/
传送门
下载JIntellitype.jar
<dependency>
<groupId>com.melloware</groupId>
<artifactId>jintellitype</artifactId>
<version>1.3.9</version>
</dependency>
不是maven项目可以到专门的maven
仓库下载,在这提供一个:https://maven.aliyun.com/mvn/search
,自己搜索jintellitype
。
代码:
import java.awt.AWTException;
import java.awt.Desktop;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Optional;
import javax.imageio.ImageIO;
import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;
public class ScreenCaptureTest {
private static final String DEFAULT_DIR = "C:\\Users\\Administrator\\Desktop";
public static void main(String[] args) {
registryHotKey();
}
// 截屏
public static void capture(String dir, String fileName) {
// 获取屏幕的大小
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
// 创建矩形区域
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot;
try {
robot = new Robot();
BufferedImage image = robot.createScreenCapture(screenRectangle); // 截取屏幕
Optional<String> dirOptional = Optional.ofNullable(dir); // 接收图片存放目录参数,允许为空
Optional<String> fileNameOptional = Optional.ofNullable(fileName); // 接收图片名称参数,允许为空
File screenFile = new File(dirOptional.orElse(DEFAULT_DIR)); // 若未传目录参数,默认指定桌面
if (!screenFile.exists()) { // 若目录不存在,则创建
screenFile.mkdirs();
}
// 若未传文件名,则使用当前时间
File f = new File(screenFile, fileNameOptional.orElse(getDateTimeStr() + ".png"));
ImageIO.write(image, "png", f); // 将图片写入文件
// 是否支持打开图片
boolean isSupport = Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.OPEN);
if (isSupport)
Desktop.getDesktop().open(f);
} catch (AWTException | IOException e) {
e.printStackTrace();
}
}
// 获取当前时间字符串
public static String getDateTimeStr() {
LocalDateTime currTime = LocalDateTime.now();
return currTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
}
// 注册热键
public static void registryHotKey() {
/*
* 注册热键,第一个参数为序号,在添加监听时会用到 第二个参数为是否时组合键,为0时即非组合键
* 第三个参数为需要注册的按键,可以使用按键code或者直接char类型大写按键代替
*/
JIntellitype.getInstance().registerHotKey(1, 0, 27); // esc 结束程序
JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, 'K'); // ALT + K 截屏
/*
* 注册监听,case选项的值即为注册热键时热键的序号
*/
HotkeyListener hotkeyListener = new HotkeyListener() {
public void onHotKey(int code) {
switch (code) {
case 1:
System.out.println("esc");
JIntellitype.getInstance().cleanUp(); // 按 esc 键结束程序
break;
case 2:
System.out.println("alt + k");
capture(null, null); // 按alt + k 键截屏
break;
}
}
};
// 添加监听
JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
}
}