Я использую xlib для ввода клавиатуры. Я хочу, чтобы имитировать окна в getAsynckeystate(), чтобы проверить, нажата ли кнопка. Я попытался использовать таймер, чтобы исправить результат, но его все еще сломал , функция должна всегда возвращать истину, если «г» удерживается в нажатом положении, даже если другие клавиши нажаты или отпущены в то же время (не работает прямо сейчас)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 = ...; 'Если вы сначала используете переменную, а затем присваиваете ей значение, ваша программа имеет небольшую вероятность ошибочного поведения. Кроме того, 'clock()' является неправильной функцией времени для проверки по ряду причин, а сама проверка является избыточной. Ключ-сигнал не может появиться до нажатия клавиши. –
Моя программа не заботится о прессовых прессах или выпусках ключей, которые оба уволят одновременно. Почему система unix не поддерживает знаменитое событие «HOLD KEY» ..... –
Я не могу разобрать ваше предложение. У вашей программы есть ошибка сразу после 'case KeyRelease', исправить ее. Извините, не знаю, что такое событие «HOLD KEY» и что он знаменит. –