1、2015/2/20 创建系统级的热键(JAVA) 所谓系统级热键就是指一组快捷键,不论当前系统焦点在哪个程序中,只要按下该键,程序就能够捕捉该事件并进行相关处理。该功能在应用程序中是非常有用的,比如系统自带的 “win+L”自动锁屏,QQ中默认的“ctrl+alt+Z”自动打开当前的消息窗口等等。 Java中的事件监听机制虽然功能强大,但是当系统焦点脱离该程序时也无能为力。要实现该功能必须调用系统的钩子函数,因此在java中也必须通过jni调用来实现,但是对于不熟悉系统函数或者其他编成语言的朋友来说却是个难题。 以前实现类似的功能都是自己通过c调用系统的钩子函数然后
2、再通过jni调用,自己写的东西只要能满足简单的需求即可,因此功能和程序结构也比较简单。后来在国外的一个网站上发现了一个组件“jintellitype”帮我们封装了绝大部分的功能,而且结构上也采用java中的事件监听机制,我们只要在程序中通过注册即可实现,下面是一个简单的例子: Java代码 1. import com.melloware.jintellitype.HotkeyListener; 2. import com.melloware.jintellitype.JIntellitype; 3. 4. public class HotKey implements
3、 HotkeyListener { 5. static final int KEY_1 = 88; 6. static final int KEY_2 = 89; 7. static final int KEY_3 = 90; 8. 9. /** 10. * 该方法负责监听注册的系统热键事件 11. * 12. * @param key:触发的热键标识 13. */ 14. public void onHotKey(int key) { 15.
4、 switch (key) { 16. case KEY_1: 17. System.out.println("ctrl+alt+I 按下........."); 18. break; 19. case KEY_2: 20. System.out.println("ctrl+alt+O 按下........."); 21. break; 22. cas
5、e KEY_3: 23. System.out.println("系统退出.........."); 24. destroy(); 25. } 26. 27. } 28. 29. 30. /** 31. * 解除注册并退出 32. */ 33. void destroy() { 34. JIntellitype.getInstance().unregisterHotKey(KEY_1
6、); 35. JIntellitype.getInstance().unregisterHotKey(KEY_2); 36. JIntellitype.getInstance().unregisterHotKey(KEY_3); 37. System.exit(0); 38. } 39. 40. /** 41. * 初始化热键并注册监听事件 42. */ 43. void initHotkey() { 44. //参数KEY_1表
7、示改组热键组合的标识,第二个参数表示组合键,如果没有则为0,该热键对应ctrl+alt+I 45. JIntellitype.getInstance().registerHotKey(KEY_1, JIntellitype.MOD_CONTROL + JIntellitype.MOD_ALT, 46. (int) 'I'); 47. JIntellitype.getInstance().registerHotKey(KEY_2, JIntellitype.MOD_CONTROL + JIntellitype.MO
8、D_ALT, 48. (int) 'O'); 49. JIntellitype.getInstance().registerHotKey(KEY_3, JIntellitype.MOD_CONTROL + JIntellitype.MOD_ALT, 50. (int) 'X'); 51. 52. JIntellitype.getInstance().addHotKeyListener(this); 53. } 54. 55. pub
9、lic static void main(String[] args) { 56. HotKey key = new HotKey(); 57. key.initHotkey(); 58. 59. //下面模拟长时间执行的任务 60. while (true) { 61. try { 62. Thread.sleep(10000); 63. } catch (Exception ex) { 64.
10、 break; 65. } 66. } 67. } 68. } 附件一:解压jintellitype.rar后会得到jintellitype-1.3.1.jar的包和一个jintellitype.dll的动态链接库文件(32位)。64位用JIntellitype64.dll。 在myeclipse的工程中新建文件夹lib,将jintellitype-1.3.1.jar复制进去。 右击jintellitype-1.3.1.jar,选择Build Path 的Add to Path。 这时候可能编译时还会报错, 这是因为没有这个包: 附件二:解压commons-logging-1.2-bin.zip 并安上述方法导入commons-logging-1.2.jar包。 然后编译会发现这样的错误 这是因为还没有添加之前解压的jintellitype.dll文件, 这里将jintellitype.dll这个文件复制到jdk安装目录下的jar中的bin文件夹中如:D:\jdk7_azh\jre\bin。这不是一个长久之计。 到此就能全部运行了。。。。。。






