Как захватить любой ключ в X? - PullRequest
5 голосов
/ 30 мая 2010

Я создаю приложение, для которого мне нужно периодически получать информацию о пользователях клавиатуры. Это будет приложение для обнаружения простоя пользователя. У меня есть довольно простое решение периодически проверять, была ли перемещена мышь. Но я не могу придумать какой-либо разумный способ не root, чтобы определить, была ли нажата клавиатура.

Я думал о регистрации перехвата каждый тайм-аут и при любом нажатии клавиши, чтобы отменить его регистрацию. Поэтому, если в течение долгого времени нет нажатия клавиш, моя программа будет знать, находится ли пользователь в режиме ожидания.

В любом случае, я не смог найти глобальных хуков для любой клавиши, включая модификаторы. Есть простой способ сделать это? Или у кого-нибудь есть лучший способ обнаружить бездействие клавиатуры?

Спасибо

Ответы [ 3 ]

4 голосов
/ 09 июня 2010

После долгих поисков я нашел это:

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 голос
/ 30 мая 2010

Посмотрите на xautolock источник, который делает именно то, что вам нужно, для клавиатуры и мыши. http://www.ibiblio.org/pub/Linux/X11/screensavers/xautolock-2.2.tgz

0 голосов
/ 06 ноября 2014

У меня есть код, который может отслеживать активность клавиатуры для вас.

#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 и т. Д. Имя клавиши отображаться не будет.

...