2016-07-31 2 views
1

키보드 입력을 얻기 위해 xlib을 사용하고 있습니다. 버튼을 눌렀는지 확인하기 위해 getAsynckeystate() 윈도우를 시뮬레이트하고 싶습니다. 타이머를 사용하여 결과를 수정했지만 여전히 고장났습니다. . 다른 키를 누르거나 동시에 출시되는 경우에도 'z는'누르고있는 경우 함수는 항상 다음과 같은 기능을 연결 nm의xlib XNextEvent 키가 눌러져 있는지 확인합니다.

bool KeyboardState::keyPressed(Display* d, Window curFocus,int revert, Window root) { 
XEvent ev; 
XNextEvent(d, &ev); 
clock_t startTime; 
switch (ev.type) { 
    case FocusOut: 
     if (curFocus != root) 
      XSelectInput(d, curFocus, 0); 

     XGetInputFocus(d, &curFocus, &revert); 
     printf("New focus is %d\n", (int) curFocus); 

     if (curFocus == PointerRoot) 
      curFocus = root; 

     XSelectInput(d, curFocus, KeyReleaseMask | FocusChangeMask | KeyPressMask); 
     break; 

    case KeyPress: 
     ks = XLookupKeysym(&(ev.xkey), 0); 

     if (ks == XK_z) { 

      keyState = true; 
      startTime = clock(); 
     } 
     break; 
    case KeyRelease: 
     if(ks == XK_z && startTime - clock() > 0){ 

     ks = XLookupKeysym(&(ev.xkey), 0); 
      keyState = false; 
     } 
} 
return keyState; 
} 
+1

'경우 (KS == ...) ...; ks = ...;'변수를 처음 사용하고 그 변수에 값을 할당하면 프로그램에 약간의 오류가 발생할 수 있습니다. 덧붙여,'clock()'은 여러 가지 이유로 검사 할 잘못된 시간 함수이며 검사 자체가 중복됩니다. 키 릴리스는 키를 누르기 전에 도착할 수 없습니다. –

+0

내 프로그램은 언론 보도 또는 키 릴리스에 대해 신경 쓰지 않습니다. 둘 다 동시에 해고 당합니다. 왜 유닉스 시스템이 유명한 'HOLD KEY'이벤트를 지원하지 않습니다 ..... –

+0

귀하의 문장을 구문 분석 할 수 없습니다. 귀하의 프로그램은'case KeyRelease' 바로 다음에 버그가 있습니다. 죄송합니다. 'HOLD KEY'이벤트가 무엇이며 유명한 이벤트입니다. –

답변

0

아래

코드 (지금 작동하지)가 true를 반환해야합니다 대답으로 받아 들여 :

tronche.com/gui/x/xlib/input/XQueryKeymap.html

관련 문제