当您按住键盘键并尝试处理它时,有谁知道为什么会有一些犹豫?我正在WinProc(...)中调用一个函数,当按下一个键时,它会在屏幕上移动一个图像(OpenGL)。我按下它并得到一个响应,然后大约有0.5秒没什么,然后它表现正常(每个WinMain循环移动1个像素)。
我想知道Windows消息是否因某些功能而被延迟,因为我需要禁用某些功能???
这是我的代码:
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int nshowcmd)
{
bool quit = false;
MSG msg;
createWindow(hinstance, SCRW, SCRH, SCRD, WINDOWED);
// Main loop
while (!quit)
{
if (PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE))
{
if (msg.message == WM_QUIT)
quit = true;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
renderFrame(); // processes graphics
SwapBuffers(hdc);
}
return msg.lParam;
}
和WinProc(有更多案例,但同样的事情......):
LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
switch(msg)
{
case WM_KEYDOWN:
switch ( wparam )
{
case VK_RIGHT:
key_RIGHT();
return 0;
}
return 0;
}
}
和key_RIGHT:
void key_RIGHT()
{
MoveObjectRight1Pixel();
}
答案 0 :(得分:3)
这是一个相当标准的键盘设置,在按下按键和生成重复消息之间有一个小的延迟。
而不是在Windows消息处理程序中处理键盘输入,而是保留256位数组,指示键盘的当前状态。收到WM_KEYDOWN
或WM_KEYUP
后,您将更新相应密钥的位。然后,在主循环中,检查密钥的当前状态和密钥的先前状态(通过保留第二个256位数组,您可以复制到每个帧)。
如果该键当前已关闭但未在前一帧中关闭,则会相应地移动对象。
另一种方法是使用GetAsyncKeyState()
函数。
答案 1 :(得分:1)
嗯,我认为你在这里处理标准的Windows功能。在键被禁止时,Windows通常会在触发重复击键事件之前有一段延迟。
我不知道其他方法,但是在第一次按键时你可以激活一个定时器,它会检查密钥是否每隔几毫秒被抑制一次,然后相应地处理你的代码。
我认为这可以解决您遇到的问题。