首先需要调用第三方包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();
}
}