【问题标题】:Handling keyboard input using windows messages and directx 9使用 Windows 消息和 directx 9 处理键盘输入
【发布时间】:2014-06-19 09:30:34
【问题描述】:

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

如果按键被按下,我创建了两个 256 成员 bool 数组来保存。我想这样做,以便我可以查看 m_bKeyDown[256] 以查看此帧是否按下了某个键,并查看 m_bKeyDown 是否已按下它,但未按下此帧。我的 MsgProc switch 语句如下:

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 的以下示例,现在效果更好,但声音在停止之前仍然播放了三遍,就像由于某种原因有延迟一样。知道如何避免这种情况吗?

【问题讨论】:

    标签: c++ visual-studio-2012 keyboard directx-9 directinput


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 感谢您的重播。它现在停止,但只有在它播放了 3 次声音之后才会停止,就像某处有延迟一样。
    • 除非它自己做,否则不会。不应该。目前这个很简单,就是做一个窗口,我按一个按钮就可以发出声音了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2010-09-23
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    相关资源
    最近更新 更多