系统级热键就是指一组快捷按键,不论当前系统焦点在哪个程序中,只要按下该键,程序就能够捕捉该事件并进行相关处理。该功能在应用程序中是非常有用的,比如微信的Alt+A截屏快捷键。
Java中的事件监听机制虽然功能强大,但是当系统焦点脱离该程序时也无能为力。,Java的最底层是jvm,所以单纯的java不能感知jvm再下面的操作系统的情况,所以单纯的使用java是不能完成这个功能的。要实现该功能必须调用系统的钩子函数,因此在java中也必须通过jni调用来实现,但是对于不熟悉系统函数或者其他编成语言的朋友来说却是个难题。
真的这么难?其实很简单
后来发现了jintellitype组件,jintellitype帮我们封装了绝大部分的功能,而且结构上也采用java中的事件监听机制,我们只要在程序中通过注册即可实现。
1. 使用jintellitype你需要下载jar和dll文件
官方下载地址:https://code.google.com/archive/p/jintellitype/downloads
google需要翻墙,所以我共享一个自己下载的
链接:https://pan.baidu.com/s/1pJYkMbq1nPWks3244nW9yQ
提取码:555q
2.将下载后解压的jar和dll文件引入项目中
如何引用jar就不说了,可以写maven或引用下载的本地jar
<dependencies>
<!-- https://mvnrepository.com/artifact/com.melloware/jintellitype -->
<dependency>
<groupId>com.melloware</groupId>
<artifactId>jintellitype</artifactId>
<version>1.3.9</version>
</dependency>
</dependencies>
dll的引用路径是com/melloware/jintellitype/JIntellitype.dll,所以要放在这下面
3.案例代码
/**
* @Author: net.itxw.houyong
* @Date: 2019/9/19
*/
public class CutScreen implements HotkeyListener {
private final int HOTKET=111;
public static void main(String[] args) {
CutScreen cs=new CutScreen();
cs.setTray();
}
public CutScreen(){
//添加监听
if (JIntellitype.isJIntellitypeSupported()) {
//注册热键快捷键
JIntellitype.getInstance().registerHotKey(HOTKET, JIntellitype.MOD_ALT, 'X');
//启动监听
JIntellitype.getInstance().addHotKeyListener(this);
}
}
//添加托盘显示:1.先判断当前平台是否支持托盘显示
public void setTray() {
if(SystemTray.isSupported()){//判断当前平台是否支持托盘功能
//创建托盘实例
SystemTray tray = SystemTray.getSystemTray();
//创建托盘图标:1.显示图标Image 2.停留提示text 3.弹出菜单popupMenu 4.创建托盘图标实例
//1.创建Image图像
String imagePath=this.getClass().getResource("/").getPath()+"image/itxw.jpg";
Image image = Toolkit.getDefaultToolkit().getImage(imagePath);
//2.停留提示text
String text = "IT学问网";
//创建托盘图标
TrayIcon trayIcon = new TrayIcon(image,text);
//将托盘图标加到托盘上
try {
tray.add(trayIcon);
} catch (AWTException e1) {
e1.printStackTrace();
}
}
}
/**
* 快捷键组合键按键事件
* @param i
*/
@Override
public void onHotKey(int i) {
//如果是我指定的快捷键就执行指定的操作
if(i==HOTKET){
System.out.println("xxx");
}
}
}