如何捕捉X中的任何键?

我正在构build一个应用程序,我需要定期获取有关用户键盘的信息。 这将是用户空闲检测应用程序。 我有一个相当简单的解决scheme来定期检查鼠标是否被移动。 但是我无法想象任何合理的非根方法来检测键盘是否被按下。

我正在考虑注册每个计时器超时挂钩,并在任何按键注销它。 所以如果长时间没有按键,我的程序就会知道用户是否空闲。

无论如何,我找不到任何关键的全局钩子,包括修饰符。 是否有捷径可寻? 或者有人有更好的方法来检测键盘闲置?

谢谢,大卫波拉克

经过大量的搜索,我发现这一点:

bool kbdActivity(Display* display) // checks for key presses { XQueryKeymap(display, keymap); // asks x server for current keymap for (int i=0; i<32; i++) // for 0 to 32 (keymap size) { if (prevKeymap[i] != keymap[i]) // if previous keymap does not { // equal current keymap XQueryKeymap(display, prevKeymap); // ask for new keymap return true; // exit with true } } return false; // no change == no activity } 

当我每100-300ms调用它时,它会检测到X中任何按键。

看看xautolock源代码,它完全符合你所需要的键盘和鼠标。 http://www.ibiblio.org/pub/Linux/X11/screensavers/xautolock-2.2.tgz

我有一些可以跟踪键盘活动的代码。

 #include "stdafx.h" #include <stdio.h> #include "windows.h" #include "iostream" using namespace std; int main(void) { HANDLE hStdInput, hStdOutput, hEvent; INPUT_RECORD ir[128]; DWORD nRead; COORD xy; UINT i; hStdInput = GetStdHandle(STD_INPUT_HANDLE); hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); FlushConsoleInputBuffer(hStdInput); hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); HANDLE handles[2] = { hEvent, hStdInput }; while (WaitForMultipleObjects(2, handles, FALSE, INFINITE)) { ReadConsoleInput(hStdInput, ir, 128, &nRead); for (i = 0; i<nRead; i++) { switch (ir[i].EventType) { case KEY_EVENT: if (ir[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) SetEvent(hEvent); else { xy.X = 0; xy.Y = 0; SetConsoleCursorPosition(hStdOutput, xy); printf ( "AsciiCode = %d: symbol = %c\n", ir[i].Event.KeyEvent.uChar.AsciiChar, ir[i].Event.KeyEvent.uChar.AsciiChar ); // note that some keys have a AsciiCode of 0 such as shift, ctrl, and the // rest you can try out yourself } break; } } }; return 0; } 

在这个代码中,它跟踪键盘活动,现在它显示你按下的键和AsciiCode,也用于shift,ctrl等键名不会显示。