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

'場合(KS == ...)...; ks = ...; '最初に変数を使用して値を代入すると、プログラムは不安定な動作をします。さらに、 'clock()'はチェックする間違った時間関数であり、いくつかの理由からチェック自体は冗長です。鍵盤を離す前に鍵盤を離すことはできません。 –

+0

私のプログラムでは、プレスとプレスリリースが同時に発生することはありません。なぜ有名な「HOLD KEY」イベントをサポートしていないのですか? –

+0

あなたの文章は解析できません。あなたのプログラムは、 'case KeyRelease'の直後にバグを修正しています。申し訳ありませんが、 'HOLD KEY'イベントが何であり、それが有名なのかどうかは分かりません。 –

答えて

0

の下

コード(今は働いていない)はtrueを返す必要がありますその答えとして受け入れ:

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

関連する問題