Буфер ввода командной строки Win32 не перехватывает нажатие клавиш - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь написать игру для DOS с помощью командной строки Windows. У меня здесь упрощенный исходный код:

#include <windows.h>
#include <stdio.h>

HANDLE hStdin;
VOID KeyEventProc(KEY_EVENT_RECORD);

int main(VOID) {
    DWORD cNumRead, fdwMode, i;
    INPUT_RECORD irInBuf[128];
    hStdin = GetStdHandle(STD_INPUT_HANDLE);

    while(true) {
        ReadConsoleInput(hStdin, irInBuf, 128, &cNumRead);

        for (i = 0; i < cNumRead; i++) {
            switch(irInBuf[i].EventType) {
                case KEY_EVENT:
                    KeyEventProc(irInBuf[i].Event.KeyEvent);
                    break;
                default:
                    break;
            }
        }
    }
    return 0;
}

VOID KeyEventProc(KEY_EVENT_RECORD ker) {
    if(ker.bKeyDown) {}
    else printf("key released\n");
}

Проблема в том, что при нажатии нескольких кнопок в определенных комбинациях они больше не регистрируются!

Например, запустите эту программу и нажмите a, затем отпустите. Он скажет вам, что вы отпустили кнопку.

Теперь нажмите j, k и l. Когда вы отпустите любую из этих кнопок, она сообщит вам

СЕЙЧАС нажмите j, k, l и i. Когда вы отпустите меня, он больше не будет регистрировать, что кнопка была отпущена !!! o.0

ОДНАКО, если вы нажмете j, k, l и d, затем отпустите кнопку d, и вы узнаете. Так что, похоже, это не проблема «максимальных депрессивных состояний», поскольку она может обрабатывать все 4, когда вы нажимаете эти буквы.

Теперь, если вы нажмете j, k, l, i, а затем d и отпустите кнопку d, это не даст вам знать, что кнопка была отпущена. Похоже, что некоторые буквы портят.

Я очень растерялся, и я был бы очень признателен за любую помощь, которую кто-либо готов оказать.

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

Если у кого-то есть лучший способ сделать это в Windows API, я открыт для предложений

Ответы [ 2 ]

2 голосов
/ 07 декабря 2011

Это ограничение вашего оборудования клавиатуры. Клавиатуры с ограниченной поддержкой rollover обычно начинают работать не так, как только вы нажимаете более 2 клавиш одновременно.

1 голос
/ 07 декабря 2011

Возможно, вам повезет больше с GetKeyboardState или GetAsyncKeyState Но это может быть невозможно вообщеМногие клавиатуры не предназначены для отслеживания произвольного количества одновременно нажатых клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...