我正在使用xlib来获取键盘输入,我想模拟Windows的getAsynckeystate()函数来检查按钮是否被按下。我尝试使用定时器来修复结果,但仍然存在问题。如果“z”键被按住,该函数应始终返回true,即使同时按下或释放其他键(目前无法正常工作)
以下是代码:
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;
}
clock()
函数进行检查是不正确的,原因有很多,而且这种检查本身也是冗余的。按键释放不能早于按键按下。 - n. m.case KeyRelease
之后,你的程序有一个错误,请修复它。抱歉,我不知道“HOLD KEY”事件是什么以及它因何而闻名。 - n. m.if(getasynckeystate('z')){}
,为什么Linux中不能存在相同的东西,难怪没有人使用这个操作系统... - Mercenary_Frank