Java监听Mac键盘输入实现即时功能

背景需求

当你想使用Java给Mac上注册的新闻时,你百度到可以通过jnativehook实现。然后你发现,下载下来的例子进行了运行不了,这篇文章说的就是如何解决这个问题,以及如果通过这个jnativehook实现Mac上的系统级更新。

jnativehook

JNativeHook 为 Java 程序提供的键盘和鼠标事件侦听功能。你来处理程序外的键盘输入和鼠标动作。当然 JNativeHook 使用了 JNI 技术调用了系统的方法来实现该功能。

github地址:GitHub - kwhat/jnativehook: Global keyboard and mouse listeners for Java.

引用正确的依赖

如果你是在 maven 仓库中进行搜索的话,你会发现它有好几个来源

图片.png

这个时候,不应该点开第一个,因为当你使用第一个的时候就会导致之后的Simple Code 执行不了。

正确的应该是选择2021年最新更新的那个人,也就是它

图片.png

简单例子

jnativehookgithub上阅读me.md页面上实际上讲了一个很实用的例子,可以满足自己的需求了。

图片.png

好吧,这时候你又新建了一个 Maven 项目,然后引入了就说到了最新的依赖,我想是没错的。

 扫VX 领Java资料,前端,测试,python等等资料都有

然后当你复制这个Demo进行启动main方法的时候,第一次执行mac会弹出提示说,发给Applicaiton权限。

类似以下画面,权限就行

图片.png

成功的执行了这个工具的性能,你就可以实时的监听你的操作了。

图片.png

注册社区新闻

好的,完成以上内容之后,现在该我们讲这个代码了。在使用的过程中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等等资料都有


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值