繁体   English   中英

如何在Linux世界中(不使用GL和X11 / XKBlib.h)在C ++中按下shift / ctrl键?

[英]How to identify shift/ctrl keys were pressed in the linux world (without using GL and X11/XKBlib.h) in C++?

我以前在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。

谢谢,弗拉基米尔。

我将使用Linux Input API进行此操作。 此处查看Youarefunny的答案以了解如何检查当前键状态(按下或释放)。

这种检查可能会花费大量时间,尤其是如果您需要经常打电话的时候。 因此,一旦确定了初始状态,您就可以通过从设备文件中读取输入事件来监视更改,如下所示(为了简洁起见,我跳过了错误检查):

#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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM