2009-04-07 7 views
1

キーボードのキーを押したまま処理しようとすると、ちょっと躊躇している理由は誰にも分かりますか? WinProc(...)の中で、キーが押されているときに画面上の画像(OpenGL)を動かす関数を呼び出しています。私はそれを押して、1つの応答を取得し、約0.5秒の何もない、それは通常のように振る舞います(WinMainループごとに1ピクセル移動します)。キーボード入力が躊躇されていますか?

私は無効にする必要があるいくつかの機能のためにWindowsのメッセージが何とか遅れているのだろうかと思います。

ここに私のコードです:

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd) 
{ 
    bool quit = false; 
    MSG msg; 

    createWindow(hinstance, SCRW, SCRH, SCRD, WINDOWED); 

    // Main loop 
    while (!quit) 
    {  
     if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) 
     { 
      if (msg.message == WM_QUIT) 
       quit = true; 

      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 

     renderFrame();  // processes graphics 
     SwapBuffers(hdc); 
    } 
    return msg.lParam; 
} 

とWINPROC(より多くの例が、同じことが...ありました):

LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) 
    { 
     switch(msg) 
     { 
      case WM_KEYDOWN: 
       switch (wparam) 
       { 
        case VK_RIGHT: 
         key_RIGHT(); 
         return 0; 
       } 
       return 0; 
} 
} 

とkey_RIGHT:

void key_RIGHT() 
{ 
    MoveObjectRight1Pixel(); 
} 

答えて

3

これは、キーが押されてからリピートメッセージが生成されるまでの間にわずかな遅延があるように設定されているキーボード設定です。

Windowsのメッセージハンドラでキーボード入力を処理する代わりに、キーボードの現在の状態を示す256ビットの配列を保持することができます。 WM_KEYDOWNまたはWM_KEYUPを受け取ると、対応するキーのビットを更新します。次に、メインループで、キーの現在の状態とキーの前の状態をチェックします(256ビットの2番目の配列を保持して、すべてのフレームにコピーを作成します)。

キーが現在ダウンしていますが、前のフレームでキーがダウンしていない場合は、それに従ってオブジェクトを移動します。

もう1つの方法は、GetAsyncKeyState()機能を使用することです。

+0

私は愚かな回避策を講じなければならないのではないかと心配しました... Windowsに文明化された速度で私にメッセージを送るよう強制する方法はありませんか? –

+0

それは巨大なキーボードです。 :)ほとんどの標準的なPCキーボードは約105個のキーなので、128ビットは私にとって十分に聞こえます。 – unwind

+0

@unwind:ほとんどのキーボードには正当な数のキーがありますが、仮想キーコード(VK_ *定数)の範囲は0〜255です。 –

1

まあ、私はここで標準のWindows機能を扱っていると思う。 Windowsは通常、キーが押されたときに反復的なキーストロークイベントが発生するまでに遅延があります。

私は他の方法についてはわかりませんが、最初のキーを押すと、数ミリ秒ごとにキーが押されていないかどうかをチェックし、それに従ってコードを処理するタイマーを起動できます。

私はそれがあなたが持っている問題を解決すると思います。

関連する問題