зависание ввода с клавиатуры из-за wm_keyup - PullRequest
1 голос
/ 14 февраля 2012

У меня есть проблема, которая, я думаю, вызвана тем, что сообщение wm_keyup отправлено неправильно.Я считаю, что та же проблема возникает в Minecraft, когда вы перемещаете своего персонажа, и ввод будет «зависать».Действие клавиши продолжается после нажатия на нее и не прекращается, пока вы снова не нажмете клавишу.Я слышал, что это может быть проблема между окнами и клавиатурой, но я не совсем уверен.Кроме того, большинство других популярных игр не имеют этой проблемы, поэтому должен быть правильный способ сделать это.Вот как выглядит мой код процедуры Windows:

    case WM_KEYDOWN:
        for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t)
            (*t).PushKeyDown(ConvertKeyCode(wparam));
    return 0;

    case WM_KEYUP:
        for (list<KeyInput>::iterator t = key_inputs.begin(); t != key_inputs.end(); ++t)
            (*t).PushKeyUp(ConvertKeyCode(wparam));
    return 0;

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

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

Я ценю любую помощь или предложения, которые кто-либо может предложить.

1 Ответ

0 голосов
/ 12 апреля 2012

Посмотрев документацию к сообщению WM_KEYDOWN, я обнаружил, что 31-й бит lparam сообщает, было ли последнее сообщение о нажатии клавиш таким же, как последнее. Если вы используете эту информацию для игнорирования повторяющихся сообщений, вы можете избавиться от проблемы (но вы потеряете повторный ввод с клавиши, когда она удерживается). Вот мой код:

case WM_KEYDOWN:
{
    union
    {
        uint lparam;
        struct { uint bits:30,_30:1,_31:1; };
    } lparam_data;
    lparam_data.lparam = lparam;

    if (!lparam_data._30)
        // key was pushed
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...