在linux上跟踪键盘和鼠标事件

如何在C中跟踪键盘或鼠标事件?

例如,如果用户按下ESC Shift等,我应该能够跟踪它。 鼠标的方法也一样。 如果用户移动鼠标或向左或向右点击。

实现的想法是与计时器创build一个小屏幕保护程序,我正在努力如何跟踪键盘或鼠标事件重置计时器。

一种可能性是使用输入子系统。 看看这篇文章:使用输入子系统( http://www.linuxjournal.com/article/6429

另一个是创建一个工作线程,试图读取文件/ dev / input / event *,例如这里的键盘:

// (const char *)ptr - pass your device like "/dev/input/event2" here fd = open((const char *)ptr, O_RDONLY); if (fd < 0) { fprintf(stderr, "failed to open input device %s: %s\n", (const char *)ptr, strerror(errno)); return NULL; } struct timeval escapeDown = { 0, 0}; int code; while (1) { if (read(fd, &ev, sizeof(struct input_event)) < 0) { fprintf(stderr, "failed to read input event from input device %s: %s\n", (const char *)ptr, strerror(errno)); if (errno == EINTR) continue; break; } code = -1; if (ev.type == EV_KEY) { switch (ev.code) { case eEsc: if (ev.value == 1) { escapeDown = ev.time; printf("DOWN: ESC\n"); } else if (ev.value == 0 && escapeDown.tv_sec) { printf("UP: ESC\n"); if (isLongPressed(&escapeDown, &ev.time)) code = eEscLong; else code = eEsc; escapeDown.tv_sec = 0; escapeDown.tv_usec = 0; } break; case eOk: case eUp: case eRight: case eLeft: case eDown: if (ev.value == 0) { printf("UP: %s\n", keyName(ev.code)); code = ev.code; } else if (ev.value == 1) { printf("DOWN: %s\n", keyName(ev.code)); } escapeDown.tv_sec = 0; escapeDown.tv_usec = 0; break; default: break; } } if (code > 0) { struct sMsg* pMsg = malloc(sizeof(struct sMsg)); if (pMsg) { pMsg->nMsgType = eMsgKeyLogger; pMsg->nIntValue= code; postMsg(pMsg); } printf("generated keyboard event: %u %s\n", code, keyName(code)); } else usleep(100); } close(fd); 

考虑到你的项目的规模和性质,你可能想看看GLUT 。 它实际上是一个OpenGL的便利库,但也提供了易于使用的跨平台输入处理和定时器功能。 以防万一你想在将来转移到其他平台。 除此之外,它与您的应用程序的图形性质融合在一起。

编辑:我链接的项目实际上是一个全面增强的API的原始GLUT的后继者。 对于原始的API参考,看这里 。

在你的情况下,你可以使用像这样的东西:

 void keyboardFunc(unsigned char key, int x, int y) { switch (key) { case 'a': break; /* etc */ } } void displayFunc() { /* Statements issuing the drawing of your screensaver */ } int main(int argc, char** argv) { glutInit(&argc, argv); /* Other initialization code */ glutKeyboardFunc(keyboardFunc); glutDisplayFunc(displayFunc); glutMainLoop(); }