Попытка читать ввод с клавиатуры без блокировки (Windows, С++)

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

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

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

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

4
16 апр. '10 в 19:15
источник поделиться
2 ответов

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

3
16 апр. '10 в 19:44
источник

Если 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;
            }
        }
    }
}

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

2
16 апр. '10 в 20:00
источник

Посмотрите другие вопросы по меткам или Задайте вопрос