java 键盘全局监听_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类型的对象。

通过上述方法,可以实现全局的键盘监听(焦点不需要在该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();

}

}


版权声明:本文为weixin_39672011原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。