C++ 使用windows消息和directx 9处理键盘输入
我到处都读到,使用windows消息比使用DirectInput更可取。尽管如此,仍然有许多DirectInput教程,几乎没有任何关于Windows消息传递中处理键盘的教程。在没有找到任何好的来源后,我开始自己尝试 我制作了两个256个成员的布尔数组,以便在按键时保存。我想这样做,以便我可以查看m_bKeyDown[256]以查看是否按下了此帧的某个键,以及m_bKeyDown以查看是否按住了该键,但没有按下此帧。我的MsgProc开关语句如下: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
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);
谢谢你的重播。现在它停止了,但只有在它播放声音三次之后,就像在某个地方有延迟一样。除非它自己这样做。不应该这样。现在这很简单,它只是制造一个窗口,我按下一个按钮来发出声音。