Попытка прочитать ввод с клавиатуры без блокировки (Windows, C ++) - PullRequest
4 голосов
/ 16 апреля 2010

Я пытаюсь написать консольное приложение Windows (на C ++, скомпилированное с использованием g ++), которое будет выполнять серию инструкций в цикле до завершения ИЛИ, пока не будет нажата комбинация клавиш Ctrl-z (или какое-либо другое нажатие клавиши). Код, который я сейчас использую, чтобы поймать его, не работает (иначе я бы не спрашивал, верно?):

if(kbhit() && getc(stdin) == 26)
  //The code to execute when ctrl-z is pressed

Если я нажимаю клавишу, она отражается, и приложение ждет, пока я не нажму клавишу Enter, чтобы продолжить вообще. При значении 26 он не выполняет заданный код. Если я использую что-то вроде 65 в качестве значения для перехвата, он перенаправит выполнение, если я нажму A, а затем Enter.

Есть ли способ пассивной проверки ввода, выбрасывания, если это не то, что я ищу, или правильной реакции, когда это то, что я ищу? ..и без необходимости нажимать Enter позже?

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

Попробуйте ReadConsoleInput , чтобы избежать готового режима, и GetNumberOfConsoleInputEvents , чтобы избежать блокировки.

2 голосов
/ 16 апреля 2010

Если G ++ поддерживает conio.h, вы можете сделать что-то вроде этого:

#include <conio.h>
#include <stdio.h>

void main()
{
    for (;;)
    {
        if (kbhit())
        {
            char c = getch();
            if (c == 0) {
                c = getch(); // get extended code
            } else {
                if (c == 'a') // handle normal codes
                    break;
            }
        }
    }
}

Эта ссылка может объяснить вам немного больше.

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