2016-07-31 267 views
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; 
} 
+1

'如果(KS == ...)...; ks = ...;'如果你第一次使用一個變量,然後給它賦值,你的程序有一些不穩定的行爲。另外,由於許多原因,clock()是錯誤的時間函數,檢查本身是多餘的。密鑰發佈無法在按鍵之前到達。 –

+0

我的程序不關心他們同時被解僱的新聞界或關鍵發佈爲什麼unix系統不支持着名的「HOLD KEY」事件..... –

+0

我無法解析你的句子。你的程序在'case KeyRelease'之後有一個錯誤,修復它。對不起,不知道'HOLD KEY'事件是什麼以及它出名的。 –

回答

0

納米聯下面的函數是接受的答案:

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