C++ 如何识别C+中linux世界中按下的shift/ctrl键(不使用GL和X11/XKBlib.h)+;?

C++ 如何识别C+中linux世界中按下的shift/ctrl键(不使用GL和X11/XKBlib.h)+;?,c++,linux,C++,Linux,我过去常在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) ||

我过去常在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。。 有什么通用的方法可以直接从操作系统中检索它吗

谢谢,
Vladimir.

我会使用Linux输入API来实现这一点。查看YouareFuncy的答案,了解如何检查当前按键状态(按下或释放)

这样的检查可能需要相当长的时间,特别是如果你需要经常打电话的话。因此,一旦确定初始状态,您可以通过从设备文件读取输入事件来监视更改,如下所示(为了简洁起见,我跳过了错误检查):

#包括
#包括
int main(int argc,char*argv[])
{
结构输入\事件ev;
文件*kbd=fopen(“/dev/input/by id/usb-Dell\u Dell\u QuietKey\u Keyboard-event-kbd”,“r”);
while(fread(&ev,sizeof(ev),1,kbd)==1)
{
if(ev.type==ev_KEY&(ev.code==KEY_LEFTSHIFT | | ev.code==KEY_righshift))
{
开关(ev.值)
{
案例0:printf(“已解除换档”);中断;
案例1:printf(“按下Shift键”);中断;
案例2:printf(“移位重复”);中断;
默认:中断;
}
}
//类似于左键Ctrl、右键Ctrl等。
}
fclose(kbd);
返回0;
}
请注意,读取/dev/input/*文件可能需要root权限(除非您以前运行过
chmod
),因为默认访问模式是640,并且文件属于root

#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;
}