java全局快捷键--jintellitype
1. 简介
Java本身是无法对桌面进行全局键盘监听的,无法设置全局快捷键,当焦点从java程序面板失去时,自带的监听器就无法监听了
一些程序是需要全局快捷键操作的,此时就可以使用第三方包JIntellitype来实现全局快捷键注册。
本质上还是调用了dll动态链接库
向该第三方库注册快捷键的时候,需要指定一个int标识码,用于代表快捷键。
当用户按下快捷键的时候,把该快捷键的标识代码发送给观察者。告知观察者用户按下了这个快捷键。
我设想的工作模式是这样的:注册快捷键的时候,顺便提交一个满足特定接口的类。用户按下快捷键的时候,该第三方库就执行这个类中的接口。
事实上,这个使用模式可以仔细品品。除了用到了观察者设计模式,绝对还有别的模式。
2. 下载
网上搜索jintellitype,下载得到3个文件:jintellitype-1.3.9.jar,JIntellitype.dll,JIntellitype64.dll
3. 安装
3.1 在java项目中增加一个包,包名为com.melloware.jintellitype。并存放两个dll文件
3.2 导入jar外部包。
4. 使用
4.1 import jintellitype类
//当然也可以用ide的自动import功能
import com.melloware.jintellitype.HotkeyListener;
import com.melloware.jintellitype.JIntellitype;
4.2定义热键标识
用于在设置多个热键时,在事件处理中区分用户按下的热键
最好是在类开始的地方声明为常量
public static final int MINIMIZE_KEY_MARK = 1
4.3注册热键
第一个参数表示热键的标识
第二个参数表示主快捷键。如alt、control等。0表示不需要主快捷键
这几个主快捷键的数值定义为1,2,4,8。所以可以简单用数值相加的方式来表示快捷键组合。使用最好用引用常量的方式,代码可读性高。
第三个参数表示次会计就。如s,n等。这些都是用int来表示
必须把char类型转换成int类型,单字母直接用强制转换就行了
其它特殊按键的数值见附录。
JIntellitype.getInstance().registerHotKey(FUNC_KEY_MARK, JIntellitype.MOD_ALT +JIntellitype.MOD_CONTROL , (int)'S');
4.4添加快捷键观察者
注意,这里是用add方法。也就是说可以添加多个观察者。
按下快捷键后,所有的观察者都会被执行onHotkey方法。
onHotkey方法的参数表示之前注册的快捷键标识
网上好多采用的是内部匿名类或lambda语句。最好不要用这种方法。因为后面需要remove观察者。否则会出现多重观察的情况。比如说,点击一个按钮,该按钮的功能是注册快捷键,add观察者。重复点击按钮,就会多次注册。会导致多次执行
HotkeyListener hotkeyListener = new RunRobotHotKeyListener();
JIntellitype.getInstance().addHotKeyListener(hotkeyListener);
public class RunRobotHotKeyListener implements HotkeyListener {
public void onHotKey(int markCode) {
mRobotGos[markCode].go();
}
}
4.5 移除快捷键监听, 移除观察者
JIntellitype.getInstance().unregisterHotKey(GLOBAL_HOT_KEY_CODE_0);
JIntellitype.getInstance().removeHotKeyListener(hotkeyListener);
5. 一些特殊按键的数值
F1 = 112;
F2 = 113;
F3 = 114;
F4 = 115;
F5 = 116;
F6 = 117;
F7 = 118;
F8 = 119;
F9 = 120;
F10 = 121;
F11 = 122;
F12 = 123;
ESC = 27;
TAB = 9;
CAPSLOCK = 20;
SHIFT = 16;
CTRL = 17;
START_LEFT = 91;
START_RIGHT = 92;
CONTEXT_MENU = 93;
ALT = 18;
SPACE = 32;
CARRIAGE_RETURN = 13;
LINE_FEED = 10;
BACK_SLASH = 220;
BACK_SPACE = 8;
INSERT = 45;
DEL = 46;
HOME = 36;
END = 35;
PAGE_UP = 33;
PAGE_DOWN = 34;
PRINT_SCREEN = 44;
SCR_LK = 145;
PAUSE = 19;
LEFT_ARROW_KEY = 37;
UP_ARROW_KEY = 38;
RIGHT_ARROW_KEY = 39;
DOWN_ARROW_KEY = 40;
6. 主快捷键的数值
JIntellitype.MOD_ALT = 1;
JIntellitype.MOD_CONTROL = 2;
JIntellitype.MOD_SHIFT = 4;
JIntellitype.MOD_WIN = 8;
参考文章