如何在X中捕捉任何键?

5
我正在开发一个应用程序,需要定期获取用户键盘信息。这将是一个用户空闲检测应用程序。我有一个相当简单的解决方案来定期检查鼠标是否移动。但我无法找到任何合理的非root方式来检测键盘是否被按下。
我考虑每次计时器超时和任何按键按下时注册钩子,然后注销它。因此,如果长时间没有按键,则我的程序将知道用户是否处于空闲状态。
无论如何,我找不到任何全局钩子,包括修改器的任何键。有没有简单的方法来做到这一点?或者是否有更好的方法来检测键盘空闲?
谢谢!
3个回答

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-300ms调用一次它,它可以检测X中任何已按下的键。

1

不行,xautolock 一直在检查 X 服务器。 - David Polák
1
为什么“检查X服务器”不可行?你的方法有何不同? - Marenz

-3

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

#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等,键名不会显示。

你可能需要实现这段代码,因为我最初是用它来做安全系统的,但是它可以非常简单地改变以适应你的目的。梦想大胆思考大胆行动。 - Phi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接