Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
imkerya
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
#1

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

22.12.2013, 00:21. Просмотров 936. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2013, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на нажатие клавиш (C++):

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

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

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

одновременное нажатие клавиш - C++
подскажите как проверить если нажали одновременно 2 клавиши getch проверяет какая была нажата а не "была ли нажата вот эта кнопка" ...

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

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

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

Добавлено через 2 минуты
Цитата Сообщение от imkerya Посмотреть сообщение
уть такова, что у меня есть функция_1, которая выполняется при нажатии клавиши(Enter, например)
Далее за ней идёт функция_2, которая должна начать выполняться сразу после проверки "отжатия" клавиши,
- первый GetAsyncKeyState в ParseVKey среагирует на нажатие второй - на отжатие
0
imkerya
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
22.12.2013, 01:19  [ТС] #5
В том-то и дело.
В вашем примере я зажимаю любую стрелку и у меня начинается сыпаться в консоли сообщение о нажатии.
А мне нужно, чтобы я нажал, зажал и на протяжении этого не выводилось, кроме одного раза сообщения о нажатии. А при отжатии уже другое сообщение...
0
HighPredator
5541 / 1854 / 346
Регистрация: 10.12.2010
Сообщений: 5,469
Записей в блоге: 2
22.12.2013, 02:00 #6
Цитата Сообщение от imkerya Посмотреть сообщение
мне нужно, чтобы я нажал, зажал и на протяжении этого не выводилось, кроме одного раза сообщения о нажатии. А при отжатии уже другое сообщение
В таком случае вам нужен цикл обработки сообщений.
0
IrineK
Заблокирован
22.12.2013, 02:12 #7
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
imkerya
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
22.12.2013, 02:27  [ТС] #8
IrineK, спасибо! Это то, что я искал
Буду пробовать
0
imkerya
1 / 1 / 0
Регистрация: 18.12.2013
Сообщений: 12
24.12.2013, 23:20  [ТС] #9
В общем, поковырял немного предыдущий пример. Так и не разобрался.
Но в общем-то довел кое-что другое.
Логика работы должна быть такая:
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2013, 23:20
Привет! Вот еще темы с ответами:

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

Нажатие клавиш за определенное время - C++
Всем доброго времени суток. Возник такой вопрос... как в С++ возможно описать такое &quot;дело&quot;: пользователю даеться определенный интервал...

Синтезировать нажатие комбинации клавиш - C++
Пытался синтезировать нажатие комбинации клавиш с помощью: keybd_event(VK_CONTROL, 0, 0, 0); keybd_event(VK_MENU, 0,...

Как имитировать нажатие клавиш? - C++
Как? Спасибо всем, кто ответит!


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
24.12.2013, 23:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru