java实现键盘全局监听,且不影响原本按键功能

首先需要调用第三方包JIntellitype,在网上下载jintellitype-1.3.9.jar,JIntellitype.dll,JIntellitype64.dll三个文件。 

新建一个项目,在项目下建两个包,第一个命名为"com.melloware.jintellitype",将JIntellitype.dll,JIntellitype64.dll放入这个包内;第二个包用来放自己写的文件。将jintellitype-1.3.9.jar导入项目。目录结构如下:

使用jintellitype实现键盘全局监听,基本上只会用到4个方法。

一、注册热键

JIntellitype.getInstance().registerHotKey(1, 0, 'K');
JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, 'R');

 第一个参数为热键的编号,第二个为组合键(不需要则为0),第三个为想注册的热键对应的字符。

二、添加热键监听器

hotkeyListener = new HotkeyListener(){
			public void onHotKey(int code) {
				switch(code){
				case 1:
                    //这里写想实现的功能
					break;
				case 2:
					break;
				}
			}};
		JIntellitype.getInstance().addHotKeyListener(hotkeyListener);

三、注销热键

JIntellitype.getInstance().unregisterHotKey(1);
JIntellitype.getInstance().unregisterHotKey(2);

方法参数为热键的编号,这里要注意,注销热键,对应的监听器并不会注销。

四、 注销监听器

JIntellitype.getInstance().removeHotKeyListener(hotkeyListener);

方法参数为HotkeyListener类型的对象。

 

关于JIntellitype的使用,参考自https://blog.csdn.net/rico_zhou/article/details/80062914

 

通过上述方法,可以实现全局的键盘监听(焦点不需要在该java程序上),但是对应按键原本的功能也会失效,因此需要用到java.awt.robot类来模拟键盘动作。大致步骤如下:

//先注销热键
clearKey();
//模拟按键原本功能
robot.keyPress(KeyEvent.VK_K);
robot.delay(50);
robot.keyRelease(KeyEvent.VK_K);
//这里写其他事件
System.out.println("按了K");
//再重新注册热键
addKey();

以上是伪代码,其中robot按键需要一定的延迟,不然部分程序无法读取,特别是游戏。

 

完整代码:

package keyListener;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;

import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;

public class GlobalKeyListener{

	private Robot robot;
	private HotkeyListener hotkeyListener;
	
	public GlobalKeyListener(){
		try {
			robot = new Robot();
		} catch (AWTException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		};
		this.addKey();
		this.addKeyEvent();
	}
	
	public void addKey(){
		JIntellitype.getInstance().registerHotKey(1, 0, 'K');
		JIntellitype.getInstance().registerHotKey(2, JIntellitype.MOD_ALT, 'R');
	}
	
	public void clearKey(){
		JIntellitype.getInstance().unregisterHotKey(1);
		JIntellitype.getInstance().unregisterHotKey(2);
	}
	
	public void clearKeyEvent(){
		JIntellitype.getInstance().removeHotKeyListener(hotkeyListener);
	}
	
	public void addKeyEvent(){
		hotkeyListener = new HotkeyListener(){
			public void onHotKey(int code) {
				switch(code){
				case 1:{
					//先注销热键
					clearKey();
					//模拟按键原本功能
					robot.keyPress(KeyEvent.VK_K);
					robot.delay(50);
					robot.keyRelease(KeyEvent.VK_K);
					//这里写其他事件
					System.out.println("按了K");
					//再重新注册热键
					addKey();
					break;
					}
				case 2:{
					//这里写想实现的功能
					System.out.println("按了alt+R");
					break;
					}
				}
			}};
		JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
	}
		
	public static void main(String[] args) {
		GlobalKeyListener l = new GlobalKeyListener();
	}

}

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值