gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:36:58 26 4
gpt4 key购买 nike

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

关于c++ - 如何在 C++ 中识别在 linux 世界中按下的 shift/ctrl 键(不使用 GL 和 X11/XKBlib.h)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9015506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com