java实现后台监听快捷键(注册系统级热键)

java | 2020-03-06 16:25:47

系统级热键就是指一组快捷按键,不论当前系统焦点在哪个程序中,只要按下该键,程序就能够捕捉该事件并进行相关处理。该功能在应用程序中是非常有用的,比如微信的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");
        }
    }

}

 

登录后即可回复 登录 | 注册
    
关注编程学问公众号