【问题标题】:Check if the shift key is currently being held in the Linux text/fb console检查当前是否在 Linux text/fb 控制台中按住 shift 键
【发布时间】:2012-12-01 08:51:35
【问题描述】:

如何在 Linux 控制台中检查 SHIFT 键当前是否被按住?我所说的 Linux 控制台是指真正的文本/帧缓冲区,而不是 xterm。

如果可能,最好只使用内置/标准 shell 命令。

【问题讨论】:

    标签: linux bash console


    【解决方案1】:

    据我所知,没有任何命令可以获取键盘的转换状态。也就是说,查看console_ioctl(4),有一个ioctl 请求:TIOCLINUX, subcode=6。

    所以你可以写一个简单的 C 程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    #include <sys/ioctl.h>
    
    int main()
    {
        char shift_state;
    
        shift_state = 6;
        if (ioctl(0, TIOCLINUX, &shift_state) < 0) {
                perror("ioctl TIOCLINUX 6 (get shift state)");
                exit(1);
        }
        printf("%x\n", shift_state);
        return 0;
    }
    

    结果可以按照/usr/src/linux/include/linux/keyboard.h解释:

    #define KG_SHIFT        0
    #define KG_CTRL         2
    #define KG_ALT          3
    #define KG_ALTGR        1
    #define KG_SHIFTL       4
    #define KG_KANASHIFT    4
    #define KG_SHIFTR       5
    #define KG_CTRLL        6
    #define KG_CTRLR        7
    #define KG_CAPSSHIFT    8
    

    上面是移位量,所以Shift为1,AltGr为2,Ctrl为4,以此类推。

    【讨论】:

    • 我在 Ubuntu 16.04(内核 4.4.0)上得到 ioctl TIOCLINUX 6 (get shift state): Inappropriate ioctl for device。这是否意味着这个答案不再适用?
    • @AdamRyczkowski:你是在 Linux 控制台上运行它,而不是在 xterm/konsole/gnome-terminal/...上运行它吗?
    • gnome-terminal。现在我明白了。在虚拟终端上一切正常。现在的问题是:是否有任何解决方案适用于这两种环境?或者至少:如何解决 x-org 启动的终端?
    • @AdamRyczkowski:没有办法在大多数终端仿真器上获得转换状态。我能想到的最接近的方法是激活一些鼠标报告模式,其中包括在每次鼠标点击时返回移位状态。
    • 有是一种获取modif的方法。关键状态,例如“现代”xterm 变体(仅此一项就可以称为“大多数终端”)。只是不是所有的组合,也没有标准。这是 UNIX 遗留系统中一个非常丑陋、尘土飞扬的角落,很少有库能够解决这个问题。但是由于它们(例如ncurses),您可以在例如mcedit,慢慢赶上XXI。世纪。参见例如Paul Evans's proposal,暗示“现在已经不是 1970 年了,生活在 9,600 个调制解调器上的绿色荧光玻璃电传打字机后面”。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2016-03-07
    相关资源
    最近更新 更多