[英]How to use WM_KEYDOWN properly ?
我定义了一些函数来使用WM_KEYDOWN / WM_KEYUP处理输入,但是似乎只有WM_KEYUP可以正常工作。 使用使用WM_KEYDOWN的函数时,不会发生任何事情。 (未显示调试消息)
当在我的Framework对象中初始化我的Input类的实例时,我将其指针传递给Framwork使用的MSG对象。 (我的函数中的ESCAPE参数也与VK_ESCAPE相同)
这是我的代码:
//Input.cpp
bool Input::KeyPressed( Keys key )
{
if( InputMsg->message == WM_KEYDOWN )
{
if( InputMsg->wParam == key )
return true;
}
return false;
}
bool Input::KeyReleased( Keys key )
{
if( InputMsg->message == WM_KEYUP )
{
if( InputMsg->wParam == key )
return true;
}
return false;
}
//Framework.cpp
bool Framework::Frame()
{
ProcessInput();
return true;
}
void Framework::ProcessInput()
{
if( m_Input->KeyPressed( ESCAPE ) )
{
OutputDebugString("Escape was pressed!\n");
}
}
任何人都知道为什么只有KeyReleased()函数起作用而KeyPressed()没有起作用?
提前致谢
好的,查看您的代码,看来问题出在您的Run()
函数中的消息循环中:
void Framework::Run()
{
while( msg.message != WM_QUIT && m_result)
{
if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
m_result = Frame();
}
}
}
看看这是在做什么。 每次循环迭代,过程为:
Frame()
函数 处理完一条消息后,该消息将被分发到窗口并由您的WndProc
处理,实际上它WndProc
很少的事情。 你的大多数消息处理的是在完成Frame()
或调用的函数Frame()
但如果没有在队列中的消息功能仅调用。
这解释了为什么您看到的是WM_KEYUP
而不是WM_KEYDOWN
。 通常,至少在您以正常速度按下和释放键时,这两个消息会同时出现。
第一次通过循环, PeekMessage
将检索WM_KEYDOWN
并将其分派到您的窗口过程,该过程不会执行任何操作。
然后重复循环,并检索WM_KEYUP
。 再次将其发送到窗口过程(不执行任何操作),但是下次调用Frame()
函数时队列中没有其他消息-然后,该函数将处理最近检索到的消息,但不处理其他任何消息在那之前。
要修复代码,您需要重构消息处理,以便处理每条消息,而不仅仅是处理任何特定批处理中的最后一条。
WM_KEYDOWN经过TranslateMessage块,并作为WM_CHAR到达您的块。
因此,我认为您必须尝试使用WM_CHAR。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.