C++ 如何识别C+中linux世界中按下的shift/ctrl键(不使用GL和X11/XKBlib.h)+;?
我过去常在windows中执行以下操作: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) ||
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;
}