Нерешительность ввода с клавиатуры при удерживании? - PullRequest
1 голос
/ 07 апреля 2009

Кто-нибудь знает, почему возникают некоторые колебания, когда вы удерживаете клавишу клавиатуры и пытаетесь ее обработать? Я вызываю функцию прямо в моем WinProc (...), которая будет перемещать изображение на экране (OpenGL), когда нажата клавиша. Я нажимаю на него и получаю один ответ, затем около 0,5 секунд ничего не происходит, затем он ведет себя как обычно (перемещает на 1 пиксель каждый цикл WinMain).

Мне интересно, задерживаются ли сообщения 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 ]

3 голосов
/ 07 апреля 2009

Это довольно стандартная настройка клавиатуры для небольшой задержки между нажатием клавиши и появлением повторяющихся сообщений.

Вместо обработки ввода с клавиатуры в обработчике сообщений Windows вы можете сохранить массив из 256 бит, указывающий текущее состояние клавиатуры. Когда вы получаете WM_KEYDOWN или WM_KEYUP, вы обновляете бит соответствующего ключа. Затем в основном цикле вы проверяете текущее состояние ключа и предыдущее состояние ключа (сохраняя второй массив из 256 битов, который вы копируете в каждый кадр).

Если клавиша в данный момент не нажата, но не была нажата в предыдущем кадре, то вы соответственно перемещаете объект.

Другой альтернативой является использование функции GetAsyncKeyState().

1 голос
/ 07 апреля 2009

Ну, я думаю, вы имеете дело со стандартной функцией Windows здесь. Windows обычно имеет задержку, прежде чем она запускает повторяющиеся нажатия клавиш, когда клавиша подавляется.

Я не знаю о других методах, но при первом нажатии клавиши вы можете активировать таймер, который будет проверять, нажата ли клавиша каждые несколько миллисекунд, а затем обрабатывать ваш код соответствующим образом.

Я думаю, что это решит вашу проблему.

...