【问题标题】:Tell java which keyboard to listen to告诉java听哪个键盘
【发布时间】:2013-10-10 15:48:52
【问题描述】:

我将一个键盘插入 linux 机器,然后通过 ssh 运行我的 Java。我想知道是否有办法告诉 Java 监听来自特定键盘/终端的输入。由于我要捕获的键盘已插入物理机并且没有用户登录我不确定是否有办法做到这一点,但我想我可以在这里问一下?

【问题讨论】:

    标签: java linux keyboard


    【解决方案1】:

    如果您有 root 权限,您可以直接从/dev/input 下的键盘设备读取键盘事件。解码事件需要一点努力,但可以做到;您可以在/dev/input keyboard format 中阅读有关数据格式的信息。

    这个 sn-p 读取键盘事件并识别您按下和释放的 A-Z 键:

        // replace path with path from your system
        DataInputStream in = new DataInputStream(
            new FileInputStream("/dev/input/by-id/usb-0430_0005-event-kbd"));
        String map = "    abcdefghijlkmnopqrstuvwxyz                                                                                                                                                                                                                                                                ";
        // sizeof(struct timeval) = 16
        byte[] timeval = new byte[16];
        short type, code;
        int value;
        while (true) {
            in.readFully(timeval);
            type = in.readShort();
            code = in.readShort();
            value = in.readInt();
            System.out.printf("%04x %04x %08x %c\n", type, code, value, 
                                                     map.charAt(value>>>24));
        }
    

    【讨论】:

    • 如果 FileInputStream 没有使用 BufferedInputStream 包装,代码会抛出 java.io.IOException: Invalid argument。当代码为 DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream("/dev/input/by-id/usb-0430_0005-event-kbd")));一切正常。
    • 没错,似乎必须从 /dev/input 读取到足够大的缓冲区(例如 16 字节),以便在一次调用中完全读取整个事件。读入较小的缓冲区可能会引发 IOException。您应该在新的 BufferedInputStream 中指定合理的缓冲区大小,例如 64 字节,否则您浪费了 8KB 内存,这是默认的 BufferedInputStream 大小。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 2012-03-08
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多