C++ 如何在X中捕获任何密钥?
我正在构建一个应用程序,需要定期获取有关键盘用户的信息。它将是用户空闲检测应用程序。我有一个相当简单的解决方案来定期检查鼠标是否移动过。但我无法找到任何合理的非根方法来检测键盘是否被按下 我想在每个定时器超时时注册一个钩子,然后按任意键取消注册。因此,如果长时间没有按键,我的程序就会知道用户是否空闲 无论如何,我找不到任何键的全局钩子,包括修改器。有没有一个简单的方法可以做到这一点?或者有人会有更好的方法来检测键盘空闲吗C++ 如何在X中捕获任何密钥?,c++,linux,keyboard,hook,C++,Linux,Keyboard,Hook,我正在构建一个应用程序,需要定期获取有关键盘用户的信息。它将是用户空闲检测应用程序。我有一个相当简单的解决方案来定期检查鼠标是否移动过。但我无法找到任何合理的非根方法来检测键盘是否被按下 我想在每个定时器超时时注册一个钩子,然后按任意键取消注册。因此,如果长时间没有按键,我的程序就会知道用户是否空闲 无论如何,我找不到任何键的全局钩子,包括修改器。有没有一个简单的方法可以做到这一点?或者有人会有更好的方法来检测键盘空闲吗 谢谢请查看xautolock源代码,它完全满足您对键盘和鼠标的需求。 经过
谢谢请查看
xautolock
源代码,它完全满足您对键盘和鼠标的需求。
经过大量搜索,我发现:
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
}
bool kbdActivity(Display*Display)//检查按键情况
{
XQueryKeymap(display,keymap);//向x服务器请求当前的keymap
对于(inti=0;i我有一些代码可以为您跟踪键盘活动
#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;
}
#包括“stdafx.h”
#包括
#包括“windows.h”
#包括“iostream”
使用名称空间std;
内部主(空)
{
处理HST输入、HST输出、hEvent;
输入_记录ir[128];
德沃德·恩雷德;
坐标xy;
UINT i;
hStdInput=GetStdHandle(标准输入句柄);
hStdOutput=GetStdHandle(标准输出句柄);
FlushConsoleInputBuffer(hStdInput);
hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
句柄句柄[2]={hEvent,hStdInput};
while(WaitForMultipleObjects(2,句柄,FALSE,无限))
{
读控制台输入(HSTDI输入、ir、128和nRead);
对于(i=0;iNo),这不行。xautolock会一直检查X服务器。为什么“检查X服务器”不可行?你的方法有什么不同?你可能必须实现这段代码,因为我最初将其用于安全系统,但它可以很简单地更改以满足你的目的。梦想大想大做大