2017-01-11 2 views
3

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

+4

Там нет кросс-платформенный способ сделать это. Укажите, на какой платформе вы хотите развиваться. – Rakete1111

+1

, если вы находитесь в Windows, тогда подумайте об использовании API 'GetAsyncKeyState()' и 'GetKeyState()' – Raindrop7

+0

Добро пожаловать в StackOverflow. Ваш вопрос в его текущей форме не подходит для переполнения стека и не может отвечать в рамках этого сайта. Посетите [справочный центр] (http://stackoverflow.com/help) и прочитайте раздел [как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask). –

ответ

7

, как не упоминаемый другие Там нет кросс-платформенный способ сделать это, но на окнах вы можете сделать это следующим образом:

ниже код проверки, если клавиша «A» вниз

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> 

apoplogies, если он выглядит немного сжатым - havent еще не понял, как сделать пустые строки

2

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

Solution для Linux и совместимых систем другой Posix:

Here, for Morgan Mattews's code обеспечивает kbhit() функциональности способом, совместимый с любой совместимой системой POSIX. Он использует трюк дезактивации буферизации на уровне termios.

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

Для окон, Microsoft предлагает _kbhit()

1

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

Рассмотрим 'выбор(), если эта функция (по сообщениям Posix) доступна на вашем зева.

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


от человека страницы:

'выберите() «позволяет программе контролировать несколько дескрипторов файлов, не дожидаясь, пока один или более из файла дескрипторы становятся «готовыми» для некоторого класса операций ввода-вывода (например, ввод возможен). Дескриптор файла считается готовым, если возможно выполнить соответствующую операцию ввода-вывода (например, читать (2) без блокировки ...)»

При выборе вызывается:

а) функция выглядит на каждом Fd определены в наборах, и если это состояние FD означает, что вы можете сделать что-то (возможно, читать, возможно, писать), выберите вернется и дайте вам сделать это ... «все, что вам нужно сделать» - это сканирование бит, поиск заданного бита и принятие действий по fd, связанному с этим битом.

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

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

fyi - fd's обычно 0,1,2 ... Remembe, что C использует 0 как STDIN, 1 и STDOUT.


Простой тест настройка: открыть терминал (отдельно от моей консоли), и введите команду терминальной в этом терминале, чтобы найти свой идентификатор. Ответ, как правило, что-то вроде "/ разработчика/очки/0", или 3, или 17 ...

Тогда я получаю FD использовать в 'выберите() с помощью открытой:

// 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 
+0

Я считаю эту функцию Posix переносной. Например, я использовал «select()» на vxWorks во встроенной системе и на Ubuntu Linux. Так что, возможно, это кросс-платформа, несмотря на другие требования. –

Смежные вопросы