我有一个程序:
char getChar() {
return /*smth*/;
}
printf("INPUT: ");
char chr = getСhar();
printf("OUTPUT: %c", chr);
...问题是:它应该返回getChar什么?我需要在按下键盘上的按钮后,立即读取按下的字符。选项本质上是 1 - getchar(不要与getChar- getChar- my function 混淆,而是getchar- function from stdio.h)。但是在使用它时,我可以输入多个字符,例如:
INPUT: qwerty1234567890
OUTPUT: q
我知道.NET( Console.ReadKey)中有这样一个函数,看了它的实现,才发现这里需要WinAPI和一个函数ReadConsoleInput。这是我使用它的方式(没有检查):
char getChar() {
INPUT_RECORD inputRecord; // запись о введённом символе
unsigned long readedCharCount; // кол-во прочитанных символов
ReadConsoleInput(
GetStdHandle(STD_INPUT_HANDLE), // возвращаем дескриптор ввода консоли
&inputRecord,
1,
&readedCharCount);
return inputRecord.Event.KeyEvent.uChar.AsciiChar; // извлекаем из записи нажатый символ
}
但是当我运行上面的程序(getchar-> getChar)时,发生了难以形容的事情。如果你一步一步运行它,那么当你输入函数时,ReadConsoleInput程序会冻结,我无法在控制台中输入任何内容。如果在这个函数后面放一个断点,那么控制台就不让我输入字符了,你可以找到那个inputRecord.EventType == 16,但是应该等于1(KEY_EVENT)。此外,没有一个xxx_EVENT带有 value的宏16!我怎么理解这一点,我做错了什么?
16inINPUT_RECORD.EventTypeisFOCUS_EVENT,这很自然,因为当你从调试器切换到控制台时,它首先获得输入焦点。您只需要在阅读时跳过所有不必要的事件: