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

C++ 使用windows消息和directx 9处理键盘输入,c++,visual-studio-2012,keyboard,directx-9,directinput,C++,Visual Studio 2012,Keyboard,Directx 9,Directinput,我到处都读到,使用windows消息比使用DirectInput更可取。尽管如此,仍然有许多DirectInput教程,几乎没有任何关于Windows消息传递中处理键盘的教程。在没有找到任何好的来源后,我开始自己尝试 我制作了两个256个成员的布尔数组,以便在按键时保存。我想这样做,以便我可以查看m_bKeyDown[256]以查看是否按下了此帧的某个键,以及m_bKeyDown以查看是否按住了该键,但没有按下此帧。我的MsgProc开关语句如下: LRESULT D3DApp::MsgProc

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

我制作了两个256个成员的布尔数组,以便在按键时保存。我想这样做,以便我可以查看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下面的例子,现在它做得更好了,但是声音在停止之前仍然播放了三次,好像由于某种原因有延迟。你知道如何避免这种情况吗?

试试这个:

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);

谢谢你的重播。现在它停止了,但只有在它播放声音三次之后,就像在某个地方有延迟一样。除非它自己这样做。不应该这样。现在这很简单,它只是制造一个窗口,我按下一个按钮来发出声音。