Как проверить, нажата ли клавиша на С++

Вопрос:Как я могу проверить, нажат ли ключ в Windows? Лучший ответ: Как уже упоминалось, нет кроссплатформенного способа сделать это, но в Windows вы можете сделать это так: Код ниже проверяет, нажата ли клавиша "А". if(GetKeyState('A') & 0x8000/*Check if high-order bit is set (1

Вопрос:

Как я могу проверить, нажат ли ключ в Windows?

Лучший ответ:

Как уже упоминалось, нет кроссплатформенного способа сделать это, но в Windows вы можете сделать это так:

Код ниже проверяет, нажата ли клавиша “А”.

if(GetKeyState(‘A’) & 0x8000/*Check if high-order bit is set (1 << 15)*/) { // Do stuff }

В случае смены или аналогичного вам нужно будет передать один из них: https://msdn.microsoft.com/de-de/library/windows/desktop/dd375731(v=vs.85).aspx

if(GetKeyState(VK_SHIFT) & 0x8000) { // Shift down }

Бит младшего разряда указывает, переключается ли ключ.

SHORT keyState = GetKeyState(VK_CAPITAL/*(caps lock)*/); bool isToggled = keyState & 1; bool isDown = keyState & 0x8000;

Ох, а также не забудьте

#include <Windows.h> Ответ №1

Нет никакой переносной функции, которая позволяет проверить, попал ли ключ и продолжить, если нет. Это всегда зависит от системы.

Решение для Linux и других совместимых с posix систем:

Здесь для кода Morgan Mattews предусмотрена функциональность kbhit(), совместимая с любой совместимой с POSIX системой. Он использует трюк дезактивации буферизации на уровне termios.

Решение для окон:

Для Windows Microsoft предлагает _kbhit()

Ответ №2

проверьте, нажата ли клавиша, если да, то делайте вещи

Рассмотрим “select()”, если эта функция (как сообщается, Posix) доступна на ваших os.

‘select()’ использует 3 набора бит, которые вы создаете с помощью предоставленных функций (см. man select, FD_SET и т.д.). Вам, вероятно, только нужно создать входные биты (на данный момент)

на странице man:

‘select()’ “позволяет программе отслеживать несколько файловых дескрипторов, ожидая, что один или несколько дескрипторов файлов станут” готовыми “для некоторого класса операций ввода-вывода (например, ввод возможен). Дескриптор файла считается готовым, если возможно выполнить соответствующую операцию ввода-вывода (например, читать (2) без блокировки…)”

При вызове select:

a) функция смотрит на каждый fd, указанный в наборах, и если это состояние fd указывает, что вы можете что-то сделать (возможно, прочитайте, возможно, напишите), select вернется и позволит вам сделать это… “все, что вы получили” делать” – сканировать биты, находить бит набора и принимать меры в отношении fd, связанного с этим битом.

Первый набор (переданный в select) содержит активный вход fd (обычно устройства). Вероятно, 1 бит в этом наборе – это все, что вам нужно. И только 1 fd (т.е. Ввод с клавиатуры), 1 бит, все это довольно просто. С этим возвратом из select вы можете “делать” (возможно, после того, как вы извлекли char).

b) функция также имеет таймаут, с помощью которого вы определяете, сколько времени ждать изменения состояния fd. Если состояние fd не изменяется, таймаут приведет к тому, что “select()” вернется с 0. (т.е. Нет ввода с клавиатуры). Ваш код может сделать что-то в это время тоже, возможно, на выходе.

fyi – fd обычно 0,1,2… Помните, что C использует 0 как STDIN, 1 и STDOUT.

Простая настройка теста: я открываю терминал (отдельно от моей консоли) и набираю команду tty на этом терминале, чтобы найти свой идентификатор. Ответ обычно похож на “/dev/pts/0” или 3 или 17…

Затем я получаю fd для использования в ‘select()’, используя open:

// flag options are: O_RDONLY, O_WRONLY, or O_RDWR int inFD = open( «/dev/pts/5», O_RDONLY );

Полезно отключить это значение.

Вот фрагмент, который нужно рассмотреть (от человека):

fd_set rfds; struct timeval tv; int retval; /* Watch stdin (fd 0) to see when it has input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); /* Wait up to five seconds. */ tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv); /* Don’t rely on the value of tv now! */ if (retval == -1) perror(«select()»); else if (retval) printf(«Data is available now.n»); // i.e. doStuff() /* FD_ISSET(0, &rfds) will be true. */ else printf(«No data within five seconds.n»); // i.e. key not pressed Ответ №3

Вы говорите о функции getchar?

http://en.cppreference.com/w/c/io/getchar

Оцените статью
Добавить комментарий