Я новичок в программировании на Си. Ради интереса я начал с того, что попытался создать маленькую игру, в которой игрок представлен буквой, которую можно перемещать в окне консоли.
Одним из первых препятствий, с которыми я столкнулся, было то, что в C нет стандартного способа чтения символов с клавиатуры, не дожидаясь, пока пользователь нажмет клавишу Enter.
Конечно, в заголовочном файле conio.h есть функция Getch (), но я бы лучше использовал Windows API, так как я все равно буду работать под этой ОС. После поиска в Google я обнаружил, что GetKeyState будет лучшей функцией для этого приложения (поскольку это консольное приложение, я не могу использовать WM_KEYDOWN, верно?).
Это то, что я имею до сих пор:
#include <stdio.h>
#include <windows.h>
#define BITS sizeof(short) * 8
const short MSB = 1 << (BITS - 1);
char get_char(void);
int main(void)
{
char c;
while (1)
{
if (c = get_char()) printf("|%d|%c|\n", c, c);
}
return 0;
}
char get_char(void)
{
int i = 0;
while (i++ < 256) // All keys on the keyboard
{
if (GetKeyState(i) & MSB)
{
while (1) // Waits until the pressed key goes up again
{
if (!(GetKeyState(i) & MSB)) return i;
}
}
}
return 0;
}
Проблема, с которой я столкнулся, заключается в том, что функция get_char () не возвращает правильный символ. Например, когда я нажимаю «a» на клавиатуре, printf отображает «A».
Я понимаю, что GetKeyState работает с виртуальными ключами (не ASCII), но есть ли способ заставить функцию get_char () возвращать два значения, одно значение VK и одно значение ASCII?