按住键盘时输入犹豫不决?

时间:2009-04-07 04:37:28

标签: c++ windows opengl input messages

当您按住键盘键并尝试处理它时,有谁知道为什么会有一些犹豫?我正在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();
}

2 个答案:

答案 0 :(得分:3)

这是一个相当标准的键盘设置,在按下按键和生成重复消息之间有一个小的延迟。

而不是在Windows消息处理程序中处理键盘输入,而是保留256位数组,指示键盘的当前状态。收到WM_KEYDOWNWM_KEYUP后,您将更新相应密钥的位。然后,在主循环中,检查密钥的当前状态和密钥的先前状态(通过保留第二个256位数组,您可以复制到每个帧)。

如果该键当前已关闭但未在前一帧中关闭,则会相应地移动对象。

另一种方法是使用GetAsyncKeyState()函数。

答案 1 :(得分:1)

嗯,我认为你在这里处理标准的Windows功能。在键被禁止时,Windows通常会在触发重复击键事件之前有一段延迟。

我不知道其他方法,但是在第一次按键时你可以激活一个定时器,它会检查密钥是否每隔几毫秒被抑制一次,然后相应地处理你的代码。

我认为这可以解决您遇到的问题。