2010-05-30 4 views
5

사용자 키보드에 대한 정보를 정기적으로 받아야하는 응용 프로그램을 구축 중입니다. 사용자 유휴 감지 응용 프로그램이 될 것입니다. 나는 마우스가 이동되었는지 정기적으로 확인하는 매우 간단한 해결책이있다. 그러나 키보드를 눌렀을 때 감지 할 수있는 합리적인 비 루트 방법을 생각할 수 없습니다.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 
} 

나는 모든이 어떤 어디서나 X에서 키를 누르면 감지 100-300ms를 호출 할 때

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

은 키보드의 활동을 추적하고 지금 또한 키 이름이 표시되지 않습니다 변화, Ctrl 키 등을 위해, 당신이 누른 키와 AsciiCode을 보여줍니다.

+0

원래이 코드를 보안 시스템에 사용했기 때문에이 코드를 구현해야 할 수도 있지만, 목적을 달성하기 위해 매우 간단하게 변경할 수 있습니다. 꿈을 크게 크게 크게한다. – genius

관련 문제