[英]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.