处理键盘输入使用windows消息和directx 9

Handling keyboard input using windows messages and directx 9

本文关键字:消息 directx windows 键盘 输入 处理      更新时间:2023-10-16

我到处读到使用windows消息比DirectInput更可取。尽管如此,有很多DirectInput教程,几乎没有处理Windows消息传递中的键盘。在没有找到任何好的来源之后,我开始自己尝试。

我创建了两个256个成员的bool数组来保存按下的键。我想这样做,以便我可以查看m_bKeyDown[256],看看是否有一个键被按下这一帧,和m_bKeyDown,看看它被按下,但没有按下这一帧。我的MsgProc开关语句如下:

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
case WM_KEYDOWN:
    if(m_bKeyPressed[wParam])
        m_bKeyDown[wParam] = false;
    else
        m_bKeyDown[wParam] = true;
    break;
    m_bKeyPressed[wParam] = true;
case WM_KEYUP:
    m_bKeyDown[wParam] = false;
    m_bKeyPressed[wParam] = false;
    break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);

}

我通过让它在我按住F1键时发出声音来测试它。理想情况下,声音不应该重复,直到我释放按钮并再次按下它:

    if(m_bKeyDown[VK_F1])
    m_fMod.FPlaySound(testSound);

似乎没有区别,虽然,声音重复当我按下按钮。我如何修复循环或设置Windows消息传递来做到这一点?我是走在正确的轨道上,还是应该走完全不同的方向?

编辑:我使用iedoc的下面的例子,现在它做得更好,但声音仍然播放三次前停止,就像有一个延迟出于某种原因。知道怎么避免这种情况吗?

try this:

LRESULT D3DApp::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
case WM_KEYDOWN:
    if(!m_bKeyPressed[wParam])
    {
        m_bKeyDown[wParam] = true;
        m_bKeyPressed[wParam] = true;
    }
    else
        m_bKeyDown[wParam] = false;
    break;
case WM_KEYUP:
    m_bKeyDown[wParam] = false;
    m_bKeyPressed[wParam] = false;
    break;
}
return DefWindowProc(hwnd, msg, wParam, lParam);