我正在构建一个应用程序,我需要定期获取有关用户键盘的信息。它将成为用户空闲检测应用程序。我有一个相当简单的解决方案来定期检查鼠标是否已被移动。但我无法找出任何合理的非根方式来检测键盘是否已被按下。
我正在考虑在每个计时器超时时注册一个挂钩,并在任何按键上按下以取消注册它。因此,如果长时间没有按键,那么我的程序将知道用户是否空闲。
无论如何,我找不到任何任何键的全局钩子,包括修饰符。是否有捷径可寻?或者有人有更好的方法来检测键盘闲置?
由于
答案 0 :(得分:4)
经过大量搜索,我发现了这个:
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-300毫秒调用它时,它会在X中的任何地方检测到任何按下的键。
答案 1 :(得分:1)
查看xautolock
来源,它完全符合您的需求,适用于键盘和鼠标。
http://www.ibiblio.org/pub/Linux/X11/screensavers/xautolock-2.2.tgz
答案 2 :(得分:-2)
我有一些可以跟踪键盘活动的代码。
#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等,键名称不会显示。