2010-05-30 2 views
5

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

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

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

Спасибо, Дэвид Полак

+0

Где находится «любой» ключ? –

+1

Прямо рядом с F13 ... – Meltea

ответ

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

+0

Я посмотрю на него, спасибо ... – Meltea

+0

Нет, этого не будет. xautolock действительно проверяет сервер X все время. – Meltea

+1

Почему «проверка X-сервера» невозможна? Чем отличается ваш подход? – Marenz

-1

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

#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 и т.д. имя ключа не будет показано.

+0

Возможно, вам придется реализовать этот код, потому что я изначально использовал его для системы безопасности, но его можно очень просто изменить, чтобы служить вашей цели. DREAM BIG THINK BIG DO BIG – genius

Смежные вопросы