测试是否在 Linux 上按下键而不阻塞
Test whether key is pressed without blocking on Linux
我正在搜索如何测试是否按下了某个键。测试不应阻止程序。如果不是太重,我可以使用一个小库,但不幸的是,ncurses 是一个太多的依赖性,无法引入。
我找到了一个解决方案:
int khbit() const
{
struct timeval tv;
fd_set fds;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
select(STDIN_FILENO+1, &fds, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &fds);
}
void nonblock(int state) const
{
struct termios ttystate;
tcgetattr(STDIN_FILENO, &ttystate);
if ( state == 1)
{
ttystate.c_lflag &= (~ICANON & ~ECHO); //Not display character
ttystate.c_cc[VMIN] = 1;
}
else if (state == 0)
{
ttystate.c_lflag |= ICANON;
}
tcsetattr(STDIN_FILENO, TCSANOW, &ttystate);
}
bool keyState(int key) const //Use ASCII table
{
bool pressed;
int i = khbit(); //Alow to read from terminal
if (i != 0)
{
char c = fgetc(stdin);
if (c == (char) key)
{
pressed = true;
}
else
{
pressed = false;
}
}
return pressed;
}
int main()
{
nonblock(1);
int i = 0;
while (!i)
{
if (cmd.keyState(32)) //32 in ASCII table correspond to Space Bar
{
i = 1;
}
}
nonblock(0);
return 0;
}
效果很好。谢谢你帮助我。我希望它能帮助某人:)
我不知道
你到底在寻找什么。
我最近从这里的"原始"输入设备节点进行了概念验证读取:boost::asio 从/dev/input/event0 读取。该示例使用鼠标,但 Linux 内核统一了输入设备,因此键盘大致相同。
这里所需要的只是打开/读取设备文件的 UNIX 权限(如果这对您的部署风格更方便,您可以在/etc-tree 中创建它们)。
此示例演示事件的完全异步处理
我已经使用绑定到 XTest (
libxtst
) (实际上是发送击键);我想这可能包含您需要的功能然后是 XInput,它(据我所知)构成了 XOrg 方法来抽象我在第一个选项中描述的"原始"输入设备流
相关文章:
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- 检查串行端口Linux中是否有传入数据(cbInQue for linux)
- ofstream::close() 是否在 Linux 上调用同步?
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 如何在 Linux 下使用 c++ 知道文件是否被其他进程使用?
- 在.NET Core中是否有与DllImport等效的Linux?
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- linux 是否"rename"函数调用块,直到复制(当源和目标在不同磁盘中时)完成
- 如何检测 CDRom 是否是 Linux 上的 DVD
- 用户空间(Linux)中是否有高分辨率时钟(我们)?
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 如何检查过程是否在Red Hat Linux上运行
- Qt - 有没有办法检查窗口是否标记为始终在顶部(linux)?
- C/C++:是否可以将 Eclipse 项目设置配置为接受 void 指针而不对所有 Linux 发行版进行强制转换
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 是否可以通过图形用户界面 (GUI) 与 Linux 命令行界面 (CLI) 进行交互
- Linux/GCC:是否有一种方法可以检查构建是否与其他机器上的前一个机器相同
- clang,linux是否有一个选项可以在链接时更改共享库名称
- 是否有相当于设置的Linux功能