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;
}
'경우 (KS == ...) ...; ks = ...;'변수를 처음 사용하고 그 변수에 값을 할당하면 프로그램에 약간의 오류가 발생할 수 있습니다. 덧붙여,'clock()'은 여러 가지 이유로 검사 할 잘못된 시간 함수이며 검사 자체가 중복됩니다. 키 릴리스는 키를 누르기 전에 도착할 수 없습니다. –
내 프로그램은 언론 보도 또는 키 릴리스에 대해 신경 쓰지 않습니다. 둘 다 동시에 해고 당합니다. 왜 유닉스 시스템이 유명한 'HOLD KEY'이벤트를 지원하지 않습니다 ..... –
귀하의 문장을 구문 분석 할 수 없습니다. 귀하의 프로그램은'case KeyRelease' 바로 다음에 버그가 있습니다. 죄송합니다. 'HOLD KEY'이벤트가 무엇이며 유명한 이벤트입니다. –