gpt4 book ai didi

c++ - 使用 Windows 消息和 directx 9 处理键盘输入

转载 作者:行者123 更新时间:2023-11-28 06:53:50 33 4
gpt4 key购买 nike

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

最佳答案

试试这个:

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

关于c++ - 使用 Windows 消息和 directx 9 处理键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23432515/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com