Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12

Проверка на нажатие клавиш

22.12.2013, 00:21. Показов 7759. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу в MS Visual C++ программу.
Суть такова, что у меня есть функция_1, которая выполняется при нажатии клавиши(Enter, например)
Далее за ней идёт функция_2, которая должна начать выполняться сразу после проверки "отжатия" клавиши, т.е. сразу после отпускания.
C
1
2
3
4
if(_getch()==13)
    fun_1();
if (!(_kbhit()))
    fun_2();
Так выполняются две функции последовательно сразу. Независимо от того, нажал ли я Enter и держу его или нажав, сразу же отпустил.

C
1
2
3
4
if(_getch()==13)
    fun_1();
if ((_kbhit()))
    fun_2();
Так вторая функция не выполняется вообще.
Думаю, что нужно смотреть функции WinAPI, но что там и куда - понятия не имею.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2013, 00:21
Ответы с готовыми решениями:

Нажатие клавиш
У меня есть консольное приложение, как сделать чтобы при нажатии на определенную клавишу происходили определенные действия) Например при...

Нажатие клавиш
Ребята, перерыл интернет, но так и не понял, как сделать обработку нажатия клавиш с буквами алфавита к примеру этот код у меня работает: ...

нажатие клавиш
Что можно использовать вместо getch() чтобы программа не ждала нажатия клавиши а проверяла была ли нажата клавиша (только не bioskey)

8
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2013, 00:27
Цитата Сообщение от imkerya Посмотреть сообщение
Думаю, что нужно смотреть функции WinAPI, но что там и куда - понятия не имею.
правильно думаешь, смотри в сторону GetAsyncKeyState
https://www.cyberforum.ru/blogs/34326/blog263.html
1
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
22.12.2013, 00:57  [ТС]
Пробовал, но не получается. GetKeyState работает с такими же симптомами , как и kbhit.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
22.12.2013, 01:04
imkerya, показывай код

Добавлено через 2 минуты
Цитата Сообщение от imkerya Посмотреть сообщение
уть такова, что у меня есть функция_1, которая выполняется при нажатии клавиши(Enter, например)
Далее за ней идёт функция_2, которая должна начать выполняться сразу после проверки "отжатия" клавиши,
- первый GetAsyncKeyState в ParseVKey среагирует на нажатие второй - на отжатие
0
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
22.12.2013, 01:19  [ТС]
В том-то и дело.
В вашем примере я зажимаю любую стрелку и у меня начинается сыпаться в консоли сообщение о нажатии.
А мне нужно, чтобы я нажал, зажал и на протяжении этого не выводилось, кроме одного раза сообщения о нажатии. А при отжатии уже другое сообщение...
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
22.12.2013, 02:00
Цитата Сообщение от imkerya Посмотреть сообщение
мне нужно, чтобы я нажал, зажал и на протяжении этого не выводилось, кроме одного раза сообщения о нажатии. А при отжатии уже другое сообщение
В таком случае вам нужен цикл обработки сообщений.
0
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.12.2013, 02:12
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <Windows.h>
 
int main()
{   DWORD cNumRead, i, check = 0;
    INPUT_RECORD irInBuf[2]; 
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
 
    while(1)
    {   ReadConsoleInput(hStdin, irInBuf, 2, &cNumRead);
                
        for (i = 0; i < cNumRead; i++)
            if(irInBuf[i].EventType == KEY_EVENT)
                if (irInBuf[i].Event.KeyEvent.bKeyDown)
                {   if (!check)
                    {   printf("\nKey Down: ASCII code = %c",  irInBuf[i].Event.KeyEvent.uChar.AsciiChar);
                        check = 1;
                    }
                }
                else 
                {   printf("\nKey Up: Virtual Key code = %c",  irInBuf[i].Event.KeyEvent.wVirtualKeyCode);
                    check = 0;
                }
    }
    return 0;
}
2
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
22.12.2013, 02:27  [ТС]
IrineK, спасибо! Это то, что я искал
Буду пробовать
0
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
24.12.2013, 23:20  [ТС]
В общем, поковырял немного предыдущий пример. Так и не разобрался.
Но в общем-то довел кое-что другое.
Логика работы должна быть такая:
C
1
2
3
4
        
fun_1();
while (GetAsyncKeyState(13)){}
fun_2();
Меня смущает только то, что строка с оператором while(пока удерживается Enter), приложение грузит ЦП на 25%. Можно ли этот момент как-либо оптимизировать?

Добавлено через 13 минут
Попробовал значит так:
C
1
2
3
4
5
6
7
        
fun_1();
while (GetAsyncKeyState(13))
{
    Sleep(1);
}
fun_2();
Машина грузиться перестала вовсе, и работает точно так же, без задержек. Что скажете?

Добавлено через 16 часов 56 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
while (true)
{
    a = _getch();
    if (a == 13)
    {
        fun_1();
        while (GetAsyncKeyState(13))
        {
            Sleep(1);
        }
        fun_2();
    }
}
В этом случае, всё работает, если клавиша Enter нажата не дольше ~0.5 сек.
Работает функция 1, отпускаю - вызывается функция 2.
Если Enter держать дольше ~0.5сек, то функция 2 вызывается 2 раза. Кто может помочь?

Добавлено через 6 часов 42 минуты
Со всем разобрался. Прикладываю пример рабочего кода.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <windows.h>
using namespace std;
 
void main()
{
    bool x = true;
    while (x)
    {
        if (GetAsyncKeyState(VK_RETURN))
        {
            cout << "Enter..DOWN" << endl;
            while (GetAsyncKeyState(VK_RETURN))
                Sleep(1);
            cout << "Enter..UP" << endl;
        }
        if (GetAsyncKeyState(VK_ESCAPE))
            x = false;
        Sleep(1);
    }
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2013, 23:20
Помогаю со студенческими работами здесь

одновременное нажатие клавиш
подскажите как проверить если нажали одновременно 2 клавиши getch проверяет какая была нажата а не &quot;была ли нажата вот эта...

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

Автоматическое нажатие клавиш
Нужен код программы которая будет в открытом окне автоматически будет нажимать заданные клавиши?

Одновременное нажатие клавиш
Подскажите, как отслеживать в WinAPI в колбэке окна одновременное нажатие клавиш? Ну там типа switch(wParam) ....тралала case VK_F1: ......

Как симулировать нажатие клавиш?
как в c++ симулировать нажатие клавиш?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru