通过它重新配置键盘键盘分布。比如常用但是按起来不是很方便的按键,就可以换到自己觉得合适的地方了。还有就是“禁用”功能,就是让某些按键无效。
JIntellitype是模仿IntelliType功能的Java实现,功能与IntelliType类似,可以为Java应用程序注册全局热键和禁用某些按键。通过Java JNI库调用操作系统的API实现hook技术最终达到全局热键的效果。需要注意的是JIntelliType仅适用于Windows。Linux版可参考JxGrabKey。Mac OSX有OSSupport。
普通的java程序的热键只有在程序的窗口被激活时才能生效,一旦窗口完全失去焦点,热键就会失效。但是很多时候我们要求热键能在窗口失去焦点时仍然有效,就像ctrl+alt+z能让qq主窗口显示\隐藏,win+m能最小化桌面的所有窗口。这时就需要全局热键。
我的开发环境为64位版的win7+64位版的jdk7+Eclipse
JIntellitype下载地址。
JIntelliType的用法和注意事项:
①:设置jni库的位置。
在一个java工程中,导入JIntelliType的jar和两个dll,分别是jintelltype-1.3.9.jar/JIntelliType.dll/JIntelliType64.dll,设置加载dll的目录并验证设置是否正确。
其中JIntelliType.dll/JIntelliType64.dll分别是32位/64位版的java JNI库。
JIntellitype构造函数中,会自动加载jni库JIntelliType.dll,依次有3个步骤
1:最先会运行System.loadLibrary();试图加载32位的jni库
2:载入失败就试图加载用户指定的文件,这个文件可以是32或64位版本的jni库
3:再失败就分别到当前工作目录的"com/melloware/jintellitype/"目录下,或jintelltype-1.3.9.jar内的"com/melloware/jintellitype/"目录下,
复制32位的jni库JIntellitype.dll或64位的jni库JIntellitype64.dll到临时目录下依次试图加载。
由加载dll的过程可以知道,第1步只支持32位环境,64位java运行环境由第2步手动设置,或第3步的时候自动选择32位或64位的jni库。
在第1步中,loadLibrary()函数使windows操作系统在环境变量指定的目录和当前工作目录中搜索32位的jni库,具体的路径可以用下面两条语句打印到控制台
System.out.println(System.getProperty("java.library.path"));//环境变量目录
System.out.println(System.getProperty("user.dir")); //工作目录
结果:环境变量目录:
D:\jdk1.7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;D:/jdk1.7/bin/../jre/bin/server;D:/jdk1.7/bin/../jre/bin;D:/jdk1.7/bin/../jre/lib/amd64;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;D:/jdk1.7/bin;D:/jdk1.7/jre/bin;D:\Android\android-sdk\tools;;D:\eclipse\eclipse;;.
工作目录:
E:\java\JIntellitype
如果我不希望jni库出现在环境变量和当前工作目录,可以把jni库放在其他地方,然后用JIntellitype.setLibraryLocation()函数设置第2步中要加载的文件从而自动加载。setLibraryLocation()其实就是有相对路径的System.load().
当然也可以手动加载,但是不推荐。
比如 System.load("c:\\JIntelliType.dll");//参数必须是绝对路径
或者 System.loadLibrary("JIntelliType");//第一步就用这么一条语句实现,参数必须是不带文件名后缀,不带目录关系前缀的简单文件名字符串,其实这条语句在第二种方法中几乎不可能用到,写在这里只是为了做一个知识点的总结和备忘
注意:无论是通过setLibraryLocation()函数还是手动加载,都必须在JIntellitype.getInstance()的第一次调用前
如果需要同时对32位环境和64位环境支持,可以用第3步这种方法了,这也是最简单的方法,在"com/melloware/jintellitype/"目录下添加那两个jni库。
②:检查以确保操作系统是windows且能找到32位和64位的dll支持并加载。
if (!JIntellitype.isJIntellitypeSupported()) {
System.exit(1);
}
③:获取jintellitype对象的实例。
jinstance = JIntellitype.getInstance();//在设置jni库的位置后,加载jni库,获取单例的jintellitype对象实例
④:添加热键并设置热键监听器,设置媒体键监听器。
设置热键监听器用addHotKeyListener(),设置媒体键监听器用addIntellitypeListener()。
注意:如果添加有多个热键监听器,当热键被触发后,热键监听器会被依次执行,媒体键监听器也是如此。
//设置热键处理方法
jinstance.addHotKeyListener(new HotkeyListener() {
public void onHotKey(int identifier) {
System.out.println("触发的热键的唯一标示ID:"+identifier+",处理方法一");
}
});
jinstance.addHotKeyListener(new HotkeyListener() {
public void onHotKey(int identifier) {
System.out.println("触发的热键的唯一标示ID:"+identifier+",处理方法二");
}
});
//设置媒体键处理方法
jinstance.addIntellitypeListener(new IntellitypeListener() {
@Override
public void onIntellitype(int command) {
System.out.println("触发的媒体键的唯一标示ID:"+command);
}
});
添加热键用registerHotKey()方法,没有添加媒体键的方法
registerHotKey()有两个重载方法,
分别是registerHotKey(int identifier, int modifier, int keycode)
和registerHotKey(int identifier, String modifierAndKeyCode)
参数identifier是热键的唯一标示ID,在热键监听器中用于区别多组热键,这个ID很重要。
参数modifier是组合键的附加部分,取值见JIntellitype.swingToIntelliType()方法,如果不要组合键,参数为0。
参数keycode是键码值,取值见JIntellitype.getKey2KeycodeMapping()方法。
参数modifierAndKeyCode是忽略大小写的字符串,不同的键码用"+"分隔,组合键的附加部分限定为"win"、"alt"、"ctrl"、"shilt"、"",键码值取值范围与参数keycode相同。
// 添加热键
jinstance.registerHotKey(1, 0, (int) 'Z');// 参数为int强制转换的大写字母
jinstance.registerHotKey(2, Event.CTRL_MASK + Event.SHIFT_MASK,
(int) 'Z');
jinstance.registerHotKey(3,
JIntellitype.MOD_WIN + JIntellitype.MOD_ALT, (int) 'A');
jinstance.registerHotKey(4, "a");
jinstance.registerHotKey(5, "shift+ctrl+a");
⑤:注销热键,注销热键媒体键监听器,清除资源
注销热键:
unregisterHotKey(int identifier),参数为热键的唯一ID
注销热键监听器和媒体键监听器:
removeHotKeyListener(HotkeyListener listener)
removeIntellitypeListener(IntellitypeListener listener)
参数是要注销的监听器。
cleanUp()方法可以清除所有资源,终止JIntellitype的运行。
如果程序和JIntellitype没有终止,热键就会一直等待被触发。
一个实例:http://download.csdn.net/detail/lxqq0000/7305039