Я везде читал, что использование сообщений Windows предпочтительнее DirectInput. Несмотря на это, существует множество учебных пособий по DirectInput, и едва ли они посвящены работе с клавиатурой в сообщениях Windows. Не найдя хороших источников, я начал пробовать сам.
Я сделал два массива из 256 элементов bool для удержания, если были нажаты клавиши. Я хочу сделать так, чтобы я мог посмотреть на 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);