C ++ Проверьте, не нажата ли клавиша

J. Doe спросил: 13 июня 2018 в 03:18 в: c++

У меня есть следующий код:

for (int i = 0; i < 1;) {
        if (GetKeyState(VK_SHIFT) & 0x8000)
        {
            cout << "op";
        }
}

Отпечатает op если клавиша Shift удерживается нажатой, на самом деле он спамает выход, если вы удерживаете клавишу.

Вместо этого я хочу:

Программа распечатывает что-то один раз, когда вы нажимаете / удерживаете клавишу, вместо того, чтобы спамить ее, и единственный способ ее распечатать - это отпустить ключ и снова нажать его. Независимо от того, как долго вы удерживаете ключ, программа будет выполнять только следующий код ONCE, если вы не нажмете его еще раз.

Как сделать мой код таким?

2 ответа

Jesper Juhl ответил: 13 июня 2018 в 03:21

Вы можете просто установить bool в true, когда вы обнаружили событие "вниз", а затем установите его обратно в false, как только вы обнаружить событие "key up". Таким образом, вы можете узнать, был ли ключ уже закрыт и только сообщать, что он был нажат, если он еще не был в этом состоянии.

J. Doe ответил: 13 июня 2018 в 03:35
Я не уверен, что я последую за ним, он все равно будет спамом, пока вы его удерживаете, не так ли? Можете ли вы предоставить какой-то код, может быть?
Jesper Juhl ответил: 13 июня 2018 в 03:43
@J. Убедитесь, что Windows все равно будет генерировать события. point заключается в том, что вы будете отслеживать состояние ключа, позволяя вам сказать "произошло событие с нажатием клавиши, но ohh Я уже видел один из них без промежуточное ключевое событие, поэтому я просто проигнорирую это ". Вы действительно не можете помешать ОС из генерации событий, но вы можете отслеживать, какие из них будут действовать.
J. Doe ответил: 13 июня 2018 в 03:53
Хорошо, звучит хорошо. Поэтому мне нужно было бы проверять текущее время при каждом нажатии SHIFT, а затем проверить, как давно прошёл последний чек? Итак, как бы я это сделал? Я знаю, что вы можете использовать "CurrentTimeMilis" на Java, но на C ++ я не уверен.
Jesper Juhl ответил: 13 июня 2018 в 03:59
@J. Дой нет, нет, нет. Почему вы смешаете время? Это действительно просто. Просто укажите флаг для каждого ключевого слова, если вы уже видели событие нажатия клавиши для этого ключа. Установите, если при получении пресс-сообщения очистите его, когда вы получите событие выпуска. Когда вы решаете, следует ли действовать в прессе, рассмотрите флаг - действуйте только в том случае, если флаг еще не установлен. Не путайте вещи, добавляя время и другую бессмыслицу в уравнение. Это просто простой логический флаг.
Remy Lebeau ответил: 13 июня 2018 в 01:12
@ J.Doe if (keyPressed = false) должен быть if (keyPressed == false) или проще if (!keyPressed)
user4069705 ответил: 13 июня 2018 в 01:33

Используете ли вы Windows API? Если нет, попробуйте GetKeyState(key) < 0

Если сообщения Windows используются с функцией обратного вызова окна, вы можете использовать массив bools и проверить события WM_KEYDOWN WM_KEYUP.

Дополнительное видео по вопросу: C ++ Проверьте, не нажата ли клавиша

???? Ремонт клавиши кнопки клавиатуры ноутбука

Scanning and repairing drive c Windows 10: что делать (решение)?

Не работают горячие клавиши в Windows — Ctrl c, ctrl v, ctrl a, ctrl x, ctrl z и другие