0

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

4

1 回答 1

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);
于 2014-05-02T16:26:17.783 回答