Нужна помощь в создании моей собственной функции getch () в C с использованием Windows API в консольном приложении - PullRequest
0 голосов
/ 09 ноября 2018

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

Одним из первых препятствий, с которыми я столкнулся, было то, что в 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?

1 Ответ

0 голосов
/ 12 ноября 2018

Вам также необходимо проверить ключ «CapsLock», добавьте условие ниже: if (GetKeyState (VK_CAPITAL) & (~ MSB)); // Проверить, включен ли CapsLock Вот код:

#include <windows.h>
#include <iostream>
#define BITS sizeof(short) * 8

const short MSB = 1 << (BITS- 1);
int Case = 'a' - 'A';
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;
    int ret = 0;
    while (i++ < 256)    // All keys on the keyboard
    {
        if (ret = (GetKeyState(i) & MSB))
        {
            while (1)    // Waits until the pressed key goes up again
            {
                if (!(GetKeyState(i) & MSB))
                {
                    if (i >= 'A' && i <= 'Z') 
                    {
                        if (GetKeyState(VK_CAPITAL) & (~MSB))
                            return i;
                        else
                            return i + Case;
                    }
                    return i;
                }
            }
        }
    }
    return 0;
}
...