上一篇文章中用JNA实现的键盘监听,在Windows上完美运行,能在后台拿到扫描枪扫描输入的内容,可在Linux下还是没办法,于是在网上各种找,又找到两种办法,还是一样,在Windows上运行都没问题,最后都失败在Linux,最后,我看失败的错误描述,貌似问题都出在了图形界面X11上面还有什么键盘布局上,我的Ubuntu系统,不是标准的那种布局,就运行失败了。想了想,虽然失败了,还是记录一下吧,万一有使用redhat等系统的运行没问题呢?

一、使用jnativehook监听键盘输入

jnativehook也是个开源项目,项目地址:kwhat/jnativehook,这个项目也是全平台支持的,Windows,Linux、Mac全都支持,但是Linux下貌似是需要装X11,然后键盘布局也得是相关,不然报错了。我运行的报错如下:

报错里面的symbols/pc105我也不懂什么东西,网上一查,感觉就是个键盘类型,就像除了我们用的qwer标准键盘外,还有IBM的有F13的键盘,日文输入键盘等,总之就是我装的Ubuntu系统中没有这个文件,导致报错。但是其他系统说不定就没问题。

这个项目使用也挺简单的,从他的仓库下载JAR包,下载下来,用命令运行java -jar jnativehook.jar,就能出现一个用Swing绘制的图形小程序demo,简单演示监听到的鼠标键盘等输入,具体怎么调用的,将jar包放入eclispe,查看包内的src/java/org/jnativehook/example/NativeHookDemo.java文件就可以看到了。项目要引用,也只需要这一个jar包导入就可以,实现方法也很简单,跟Swing程序中鼠标键盘监听一模一样。下面贴上我简单实现的鼠标监听的代码,其他鼠标监听之类的可以自己研究下官方Demo源码,很明了。

import java.util.logging.Level;
import java.util.logging.Logger;import org.jnativehook.GlobalScreen;
import org.jnativehook.NativeHookException;
import org.jnativehook.dispatcher.DefaultDispatchService;
import org.jnativehook.keyboard.NativeKeyEvent;
import org.jnativehook.keyboard.NativeKeyListener;public class Test implements NativeKeyListener{private static final Logger logger = Logger.getLogger(GlobalScreen.class.getPackage().getName());public static void main(String[] args) {//关闭日志
        logger.setLevel(Level.OFF);new Test();}public Test() {//添加监听调度员,如果是Swing程序,就用SwingDispatchService,不是就用默认的GlobalScreen.setEventDispatcher(new DefaultDispatchService());try {//注册监听
            GlobalScreen.registerNativeHook();//加入键盘监听,GlobalScreen.addNativeKeyListener(this);} catch (NativeHookException e) {e.printStackTrace();}}//实现键盘监听的三个方法,根据自己情况实现
    @Overridepublic void nativeKeyTyped(NativeKeyEvent nativeEvent) {System.out.println("typed"+nativeEvent.paramString());}@Overridepublic void nativeKeyPressed(NativeKeyEvent nativeEvent) {System.out.println("pressed"+nativeEvent.paramString());}@Overridepublic void nativeKeyReleased(NativeKeyEvent nativeEvent) {System.out.println("released"+nativeEvent.paramString());}
}

二、使用JXGrabKey来监听

JXGrabKey原本是用来注册热键的,上一篇文章中介绍过,用来实现监听键盘有点怪,但如果没有更好的解决办法时,这也是一种办法,

github项目地址为:https://github.com/friedmag/jxgrabkey  不过这个里面没有相关的jar包和so文件,需要去http://sourceforge.net/projects/jxgrabkey/ 这里面下载,需要引入jar包,还需要加载so文件,还用刀了SWT的相关东西,所以你还得加入SWT的jar包,从eclipse目录下找到\plugins\org.eclipse.swt.win32.win32.x86_64_3.106.0.v20170608-0516.jar,这个包,添加到项目中才可以。

具体我的思路是将每一个按键当作一个热键,都去实现自己要实现的操作。虽然很麻烦,但确实管用!而且在我的Ubuntu下运行成功!都没报任何错。可以试试,下面贴上我的代码,只简单实现了将0-9的数字捕获,按下回车即输出。

import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;import javax.swing.JOptionPane;import jxgrabkey.HotkeyConflictException;
import jxgrabkey.HotkeyListener;
import jxgrabkey.JXGrabKey;public class JXGrabKeyTest {private static final int MY_HOTKEY_INDEX_0 = 0;private static final int MY_HOTKEY_INDEX_1 = 1;private static final int MY_HOTKEY_INDEX_2 = 2;private static final int MY_HOTKEY_INDEX_3 = 3;private static final int MY_HOTKEY_INDEX_4 = 4;private static final int MY_HOTKEY_INDEX_5 = 5;private static final int MY_HOTKEY_INDEX_6 = 6;private static final int MY_HOTKEY_INDEX_7 = 7;private static final int MY_HOTKEY_INDEX_8 = 8;private static final int MY_HOTKEY_INDEX_9 = 9;private static final int MY_HOTKEY_INDEX_100 = 100;private static boolean hotkeyEventReceived = false;static List<Character> singleInput = new ArrayList<Character>();private static String caseCode() {StringBuffer buffer = new StringBuffer();for (Character i : singleInput) {buffer.append(i);}return buffer.toString();}public static void main(String[] args) throws Exception {//Load JXGrabKey libSystem.load(new File("lib/libJXGrabKey.so").getCanonicalPath());//Enable Debug OutputJXGrabKey.setDebugOutput(true);//Register some Hotkeytry{//int key = KeyEvent.VK_K, mask = KeyEvent.CTRL_MASK | KeyEvent.ALT_MASK | KeyEvent.SHIFT_MASK;//int key = KeyEvent.VK_F2, mask = KeyEvent.ALT_MASK; //Conflicts on GNOME
            JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_0, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_0);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_1, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_1);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_2, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_2);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_3, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_3);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_4, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_4);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_5, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_5);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_6, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_6);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_7, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_7);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_8, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_8);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_9, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_9);JXGrabKey.getInstance().registerAwtHotkey(MY_HOTKEY_INDEX_100, KeyEvent.KEY_LOCATION_UNKNOWN, KeyEvent.VK_ENTER);}catch(HotkeyConflictException e){JOptionPane.showMessageDialog(null, e.getMessage(), e.getClass().getName(), JOptionPane.ERROR_MESSAGE);JXGrabKey.getInstance().cleanUp(); //Automatically unregisters Hotkeys and Listeners//Alternatively, just unregister the key causing this or leave it as it is //the key may not be grabbed at all or may not respond when numlock, capslock or scrollock is onreturn;}//Implement HotkeyListenerHotkeyListener hotkeyListener = new jxgrabkey.HotkeyListener(){public void onHotkey(int hotkey_idx) {switch(hotkey_idx) {case MY_HOTKEY_INDEX_0:singleInput.add((char) 0);case MY_HOTKEY_INDEX_1:singleInput.add((char) 1);case MY_HOTKEY_INDEX_2:singleInput.add((char) 2);case MY_HOTKEY_INDEX_3:singleInput.add((char) 3);case MY_HOTKEY_INDEX_4:singleInput.add((char) 4);case MY_HOTKEY_INDEX_5:singleInput.add((char) 5);case MY_HOTKEY_INDEX_6:singleInput.add((char) 6);case MY_HOTKEY_INDEX_7:singleInput.add((char) 7);case MY_HOTKEY_INDEX_8:singleInput.add((char) 8);case MY_HOTKEY_INDEX_9:singleInput.add((char) 9);case MY_HOTKEY_INDEX_100:System.out.println(caseCode());singleInput.clear();}//hotkeyEventReceived = true;
            }};//Add HotkeyListener
        JXGrabKey.getInstance().addHotkeyListener(hotkeyListener);//        //Wait for Hotkey Event
//        while(!hotkeyEventReceived){
//            Thread.sleep(1000);
//        }
//
//        // Shutdown JXGrabKey
//        JXGrabKey.getInstance().unregisterHotKey(MY_HOTKEY_INDEX); //Optional
//        JXGrabKey.getInstance().removeHotkeyListener(hotkeyListener); //Optional
//        JXGrabKey.getInstance().cleanUp();
    }
}

转载于:https://www.cnblogs.com/plumsq/p/10709122.html

Java后台获取USB二维码扫描枪内容(Java监听系统键盘操作)相关推荐

  1. (JAVA)获取支付宝二维码 带参数

    正文: 前端文档  后台文档 public Vo aliSmall() throws AdminException,AlipayApiException {SysUser user = shiroSe ...

  2. java后台实现生成二维码并且上传的详细介绍

    个人博客传送门 今天又遇到了新的问题,就是后台需要生成一个二维码,以前从来没有做过这个二维码,通过上午的努力,总算是完成了,希望有兴趣的可以一起交流学习.我用的是google.zxing的这个插件来完 ...

  3. Java如何获取微信二维码内的信息

    import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.i ...

  4. java后台生成微信二维码,打不开图片

    访问微信接口生成二维码图片后,打开二维码图片显示不支持此格式.我这边问题解决1.参数"scene"必传且不能修改成其他字段.2.路径中"\"替换成"/ ...

  5. Zxing初体验之------二维码扫描部分

    最近公司出的新产品中用到了二维码,由于之前只是简单的了解过,所以就先搜集了一下大神们的博客,发现很多都是基于1.6/1.7版本的,而现在都是3.3.0版本了,有一些稍微的变动了,所以决定自己动手丰衣足 ...

  6. 二维码扫描自定义规则思路

    二维码扫描自定义规则思路 二维码内容 二维码内容是一串字符串,主要凭借拆分字符串实现宿主属性的读取.可用于商品产品原材料入库.出库等操作. 使用在线的二维码生成之后,就是这样,其中可以使用特殊符号进行 ...

  7. html5调用设备摄像头,实现二维码扫描

    html5调用设备摄像头,实现二维码扫描 最近在做一个签到系统,由于我直接使用了纯网页,因此调用摄像头进行扫码成了大问题.经过几番费力的百度终于找到解决方法. 主要用到MediaDevices.get ...

  8. 微光互联QT660二维码扫描android配置

    微光互联QT660二维码扫描android配置 1.首先对android系统进行root adb root 2.然后对usb提升权限 adb shell chmod -R 777 /dev/bus/u ...

  9. android USB摄像头做条形码及二维码扫描(1)

    摘要: 1.前言 2.底层配置 3.JNI实现 4.总结 5.BUG及优化记录 android USB摄像头做条形码及二维码扫描(2) 1. 前言 公司做的产品基于android开发板搭建的控制系统, ...

  10. java实现后台直接生成二维码图片并直接上传到七牛云上面

    java实现后台直接生成二维码图片并直接上传到七牛云上面 需求:后台是直接根据唯一核销码生成图片,然后的话直接上传到七牛云,数据库只是保存地址,一开始也想错了,想成了创建临时文件存储生成的图片再上传到 ...

最新文章

  1. LLVM数据流分析的理论
  2. 马尔科夫决策过程基本概念详解
  3. 通过FactoryBean方式来配置bean
  4. [bzoj 4869] [六省联考2017] 相逢是问候
  5. Android短消息备份闪退,Android Socket发送信息时闪退
  6. 说下网鼎杯第四场的双色块
  7. 服务器最小化安装后的优化脚本
  8. 四个变量的图表怎么做_品牌策划方案怎么做?5步图文帮你绘制专业策划图表...
  9. mac chrome 跨域
  10. 2014年计算机二级c语言试题,2014年计算机二级C语言模拟试题及答案(3)
  11. Python标准库映射类型与可散列数据类型的关系
  12. Android 中文 API (29) —— CompoundButton
  13. 超级详细的 Maven 教程(基础+高级)
  14. java的panel布局_学习面panel和三种布局
  15. 左手鼠标指针——Windows11Aeroleft
  16. BMP与PPM格式的转换
  17. QT程序图标不能显示解决
  18. Android Compose 新闻App(二)ViewModel、Hlit、数据流
  19. P1567_统计天数
  20. 免费的 AI 动作捕捉工具 #Rokoko Video

热门文章

  1. JavaScript 销毁对象
  2. echarts图表销毁
  3. 用python画一条虚线_Python3 tkinter基础 Canvas create_line 画实线与虚线
  4. php phpunit_framework_testcase,开始使用PHPUnit
  5. lisp弧度转度分秒_度分秒转化成弧度的函数代码
  6. 谢烟客---------Linux之文件系统管理创建
  7. FPGA之OV7725摄像头采集与VGA显示实验--3--摄像头配置模块实现(Verilog代码)
  8. 计算机管理 合并分区,硬盘分区进行合并 硬盘分区后怎么合并
  9. C++ 模板函数 二分查找
  10. 适应智能工厂的新一代MES所需具备的核心要素