Linux下捕捉键盘事件
直接上代码:
#include <termio.h> #include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int scanKeyboard() { int in; struct termios new_settings; struct termios stored_settings; tcgetattr(0,&stored_settings); new_settings = stored_settings; new_settings.c_lflag &= (~ICANON); new_settings.c_cc[VTIME] = 0; tcgetattr(0,&stored_settings); new_settings.c_cc[VMIN] = 1; tcsetattr(0,TCSANOW,&new_settings); in = getchar(); tcsetattr(0,TCSANOW,&stored_settings); return in; } int KeyTest() { return scanKeyboard(); } // 这个函数是跨平台的 int KeyTestNew() { #ifdef _WIN32 HANDLE keyboard = GetStdHandle(STD_INPUT_HANDLE); DWORD dw, num; if (!::GetNumberOfConsoleInputEvents(keyboard, &num) || num == 0) { return 0; } for (int i = 0; i < (int)num; ++i) { INPUT_RECORD input; ::ReadConsoleInputA(keyboard, &input, 1, (LPDWORD)(&dw)); if (input.EventType == KEY_EVENT && !input.Event.KeyEvent.bKeyDown) { //return (int)(input.Event.KeyEvent.uChar.AsciiChar); return (int)(input.Event.KeyEvent.wVirtualKeyCode); } } return 0; #endif #ifdef __linux__ struct termios oldt, newt; int c, oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); c = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if (EOF != c) { if (c >= 'a' && c <= 'z') { return (c - 'a' + 'A'); } else { return c; } } else { return 0; } #endif } int main() { while(1) { int nNum = KeyTest(); printf("nNum:%d\n",nNum); } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?