背景需求
当你想使用Java给Mac上注册的新闻时,你百度到可以通过jnativehook
实现。然后你发现,下载下来的例子进行了运行不了,这篇文章说的就是如何解决这个问题,以及如果通过这个jnativehook
实现Mac上的系统级更新。
jnativehook
JNativeHook 为 Java 程序提供的键盘和鼠标事件侦听功能。你来处理程序外的键盘输入和鼠标动作。当然 JNativeHook 使用了 JNI 技术调用了系统的方法来实现该功能。
github地址:GitHub - kwhat/jnativehook: Global keyboard and mouse listeners for Java.
引用正确的依赖
如果你是在 maven 仓库中进行搜索的话,你会发现它有好几个来源
这个时候,不应该点开第一个,因为当你使用第一个的时候就会导致之后的Simple Code 执行不了。
正确的应该是选择2021年最新更新的那个人,也就是它
简单例子
在jnativehook
github上阅读me.md页面上实际上讲了一个很实用的例子,可以满足自己的需求了。
好吧,这时候你又新建了一个 Maven 项目,然后引入了就说到了最新的依赖,我想是没错的。
扫VX 领Java资料,前端,测试,python等等资料都有
然后当你复制这个Demo进行启动main方法的时候,第一次执行mac会弹出提示说,发给Applicaiton权限。
类似以下画面,权限就行
成功的执行了这个工具的性能,你就可以实时的监听你的操作了。
注册社区新闻
好的,完成以上内容之后,现在该我们讲这个代码了。在使用的过程中jnativehook
似乎没有具体针对流行的实现,也就是部分需要我们进行完成。
当然在完成上面那个demo猜我猜你也应该猜到之后怎么办,问到我们可以监听到mac的所有输入了,那模拟输入对应的然后小按钮触发相应的功能就是实现了快捷的功能。
好的,来一个小功能先,就是知道怎么只监听所有的键盘输入
简单:jnativehook/Keyboard.md at 2.2 · kwhat/jnativehook · GitHub
import com.github.kwhat.jnativehook.GlobalScreen;
import com.github.kwhat.jnativehook.NativeHookException;
import com.github.kwhat.jnativehook.keyboard.NativeKeyEvent;
import com.github.kwhat.jnativehook.keyboard.NativeKeyListener;
public class GlobalKeyListenerExample implements NativeKeyListener {
public void nativeKeyPressed(NativeKeyEvent e) {
System.out.println("Key Pressed: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
if (e.getKeyCode() == NativeKeyEvent.VC_ESCAPE) {
try {
GlobalScreen.unregisterNativeHook();
} catch (NativeHookException nativeHookException) {
nativeHookException.printStackTrace();
}
}
}
public void nativeKeyReleased(NativeKeyEvent e) {
System.out.println("Key Released: " + NativeKeyEvent.getKeyText(e.getKeyCode()));
}
public void nativeKeyTyped(NativeKeyEvent e) {
System.out.println("Key Typed: " + e.getKeyText(e.getKeyCode()));
}
public static void main(String[] args) {
try {
GlobalScreen.registerNativeHook();
}
catch (NativeHookException ex) {
System.err.println("There was a problem registering the native hook.");
System.err.println(ex.getMessage());
System.exit(1);
}
GlobalScreen.addNativeKeyListener(new GlobalKeyListenerExample());
}
}
表情实现的功能就是,键盘的任何输入都进行输出打印。
那么下一步,就是要实现的方法nativeKeyPressed
进行一下改造,做一个简单的,现在我想要实现的快捷方式是:Ctrl + Command + P 进行触发功能
对那时的方法nativeKeyPressed
进行改造
protected final static LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue();
public void nativeKeyPressed(NativeKeyEvent e) {
//当有键盘输入的时候,放入队列
try {
queue.put(e.getKeyCode());
} catch (InterruptedException ex) {
ex.printStackTrace();
}
// Ctrl + command + p
int[] hotKeyArray = {NativeKeyEvent.VC_CONTROL, NativeKeyEvent.VC_META, NativeKeyEvent.VC_P};
//如果队列中的数据大于等于3,那就进行判断是不是包含连续且等于我们指定的键的顺序
//如果存在就进行执行处罚
if (queue.size() >= 3 && judgeCombinationKey(hotKeyArray)){
try {
do something.........
} catch (InterruptedException ex) {
ex.printStackTrace();
}
queue.clear();
}
if (queue.size() == 4){
queue.poll();
}
}
protected Boolean judgeCombinationKey(int[] hotKeyArray){
Object[] queueKey = queue.toArray();
Predicate<int[]> keyArrayPredicateOne = hotKeies -> (int)queueKey[0] == hotKeies[0]
&& (int)queueKey[1] == hotKeies[1]
&& (int)queueKey[2] == hotKeies[2];
Predicate<int[]> keyArrayPredicateTwo = hotKeies -> (int)queueKey[1] == hotKeies[0]
&& (int)queueKey[2] == hotKeies[1]
&& (int)queueKey[3] == hotKeies[2];
return queue.size() == 3 ? keyArrayPredicateOne.test(hotKeyArray) :
keyArrayPredicateOne.or(keyArrayPredicateTwo).test(hotKeyArray);
}
好了,当完成以上的内容其实就已经完成了!
扫VX 领Java资料,前端,测试,python等等资料都有