1
我正在使用xlib來獲取鍵盤輸入我想模擬windows它的getAsynckeystate()來檢查按鈕是否被按下我試着用一個定時器來修復結果,但它仍然破壞。如果「Z」被按下,即使其他按鍵被按下或在同一時間發佈的函數應該總是返回真值(不是現在的工作)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()是錯誤的時間函數,檢查本身是多餘的。密鑰發佈無法在按鍵之前到達。 –
我的程序不關心他們同時被解僱的新聞界或關鍵發佈爲什麼unix系統不支持着名的「HOLD KEY」事件..... –
我無法解析你的句子。你的程序在'case KeyRelease'之後有一個錯誤,修復它。對不起,不知道'HOLD KEY'事件是什麼以及它出名的。 –