【问题标题】:How to identify shift/ctrl keys were pressed in the linux world (without using GL and X11/XKBlib.h) in C++?如何识别在 C++ 中的 linux 世界中按下了 shift/ctrl 键(不使用 GL 和 X11/XKBlib.h)?
【发布时间】:2012-01-26 08:32:21
【问题描述】:

我以前在windows里做的:

SHORT key1 = ::GetKeyState(VK_LSHIFT)& 0xF0;

SHORT key2 = ::GetKeyState(VK_RSHIFT)& 0xF0;

SHORT key3 = ::GetKeyState(VK_LCONTROL)& 0xF0;

SHORT key4 = ::GetKeyState(VK_RCONTROL)& 0xF0;


bShift = (key1 != 0) || (key2 != 0);

bCtrl = (key3 != 0) || (key4 != 0);

如何检测 linux 世界中是否按下了 shift/ctrl 键? 不使用 GL(可以在图形窗口之外按下..)或 X11.. 有什么通用的方法可以直接从操作系统中检索它吗?

谢谢, 弗拉基米尔。

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    我会使用 Linux 输入 API 来执行此操作。查看 Youarefunny 的回答 here,了解如何检查当前按键状态(按下或释放)。

    此类检查可能需要相当长的时间,尤其是在您需要经常调用时。因此,一旦您确定了初始状态,您就可以通过从设备文件中读取输入事件来监控更改,如下所示(为简洁起见,我跳过了错误检查):

    #include <stdio.h>
    #include <linux/input.h>
    
    int main (int argc, char *argv[])
    {
      struct input_event ev;
      FILE *kbd = fopen("/dev/input/by-id/usb-Dell_Dell_QuietKey_Keyboard-event-kbd", "r");
      while (fread(&ev, sizeof(ev), 1, kbd) == 1)
      {
        if (ev.type == EV_KEY && (ev.code == KEY_LEFTSHIFT || ev.code == KEY_RIGHTSHIFT))
        {
          switch (ev.value)
          {
            case 0: printf("Shift released\n"); break;
            case 1: printf("Shift pressed\n"); break;
            case 2: printf("Shift repeated\n"); break;
            default: break;
          }
        }
        // similarly for KEY_LEFTCTRL, KEY_RIGHTCTRL, etc.
      }
      fclose(kbd);
      return 0;
    }
    

    请注意,读取 /dev/input/* 文件可能需要 root 权限(除非您之前运行 chmod),因为默认访问模式是 640 并且文件属于 root。

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 2015-01-21
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多