2010-05-30 16 views
5

Estoy creando una aplicación para la que necesito obtener periódicamente información sobre el teclado de los usuarios. Va a ser la aplicación de detección inactiva del usuario. Tengo una solución bastante simple para verificar periódicamente si el mouse se ha movido. Pero no puedo encontrar ninguna forma razonable de no root para detectar si se presionó el teclado.Cómo capturar cualquier tecla en X?

Estaba pensando en registrar un enganche cada temporizador de tiempo de espera y en cualquier pulsación de tecla para anular el registro. Entonces, si no se presiona la tecla durante mucho tiempo, mi programa sabrá si el usuario está inactivo.

De todos modos, no pude encontrar ningún gancho global para ninguna clave, incluidos los modificadores. ¿Hay una forma fácil de hacer esto? ¿O alguien tendría una mejor manera de detectar la inactividad del teclado?

Gracias, David Polák

+0

¿Dónde está la tecla "cualquiera"? –

+1

Justo al lado de F13 ... – Meltea

Respuesta

4

Después de mucho buscar encontré esto:

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 
} 

Cuando llamo a cada 100-300ms detecta ninguna tecla pulsada en cualquier lugar de X.

-1

tengo un código que puede realizar un seguimiento actividad del teclado para ti.

#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; 
} 

En este código hace un seguimiento de la actividad del teclado y por ahora muestra la tecla pulsada y su AsciiCode, también para mayúsculas, control, etc no se mostrará el nombre de clave.

+0

Puede que tenga que implementar este código, porque originalmente lo usé para un sistema de seguridad, pero se puede cambiar de forma muy simple para cumplir con su propósito. DREAM BIG THINK BIG DO BIG – genius

Cuestiones relacionadas