2

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

2 回答 2

5

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

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

如果键当前向下但在前一帧中未向下,则相应地移动对象。

另一种选择是使用该GetAsyncKeyState()功能。

于 2009-04-07T04:44:15.243 回答
1

好吧,我认为您在这里处理的是标准的 Windows 功能。当按键被抑制时,Windows 通常会在触发重复击键事件之前有一个延迟。

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

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

于 2009-04-07T04:43:36.367 回答