Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Отмена ожидания если клавиша была отпущена

27.09.2021, 22:08. Показов 1877. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код (это должно быть что-то типа макроса, когда между нажатиями клавиш выполняется "умное" ожидание и если кнопка была отпущена то работа прекращается)

C++
1
2
3
4
5
6
7
8
9
10
11
for(int i = 0; i < 250; i++)
{
    if(!(GetAsyncKeyState(VK_RBUTTON) < 0))
    {
        return;
    }
    
    Sleep(1);
}
 
// До сюда не дойдёт если кнопка будет отпущена
По задумке он должен ждать 250 миллисекунд, каждую миллисекунду проверяя состояние клавиши, но почему-то происходит что-то не то. Как будто проходит больше чем положено. Однако, когда я меняю на Sleep(250) то все становится на свои места. Почему так и как более правильно реализовать эту задумку? Я мог бы убивать поток через TerminateThread если получаю событие отжатия клавиши, но как я понял это не очень хорошее решение и по этому решил прийти к такому костылю со Sleep(1) и проверкой в цикле..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2021, 22:08
Ответы с готовыми решениями:

Нажата или отпущена конкретная клавиша С++
Доброго времени суток. Столкнулся с такой проблемой: на клавиатуре нажимается клавиша. Нужно определить что за клавиша нажата, и как долго....

Как узнать, что отпущена горячая клавиша
На форме есть компонент ApplicationEvents. Он отслеживает нажатие горячих клавиш. А есть ли способ отследить что горячая клавиша...

Как определить зажата или отпущена клавиша?
Всем привет, возникла проблема, для плавного передвижения персонажа в мини-игре не подходит readkey, есть ли какие-нибудь функции для...

8
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
27.09.2021, 22:52
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Есть следующий код (это должно быть что-то типа макроса, когда между нажатиями клавиш выполняется "умное" ожидание и если кнопка была отпущена то работа прекращается)
Зачем проверять постоянно? Проверяй нажатие и отпускание - время между ними и есть искомое. Для чего это нужно вообще?
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
27.09.2021, 22:57  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Для чего это нужно вообще?
Допустим есть макрос который делает следующее:

Нажатие правой кнопки мыши
Отпускание правой кнопки мыши
Задержка 250 миллисекунд
Нажатие левого шифта
Задержка 100 миллисекунд
Отпускание левого шифта

Нужно сделать так чтобы как только кнопка действия макроса (допустим F) была отпущена, то макрос переставал работать. Если я сделаю проверки после ожидания (Sleep) то работать перестанет не сразу.

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
Проверяй нажатие и отпускание
То же самое в цикле с задержкой 1 миллисекунда только уже не состояние клавиши а проверка задержки между переключениями состояний? - __-
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
27.09.2021, 23:04
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Нужно сделать так чтобы как только кнопка действия макроса (допустим F) была отпущена, то макрос переставал работать. Если я сделаю проверки после ожидания (Sleep) то работать перестанет не сразу.
Ну так при каждой итерации проверяй кнопку, зачем каждую миллисекунду?
Нажатие правой кнопки мышы;
(проверка F)
Отпускание правой кнопки мыши;
(проверка F)
Задержка 250 миллисекунд;
(проверка F)
....
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
27.09.2021, 23:09  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
зачем каждую миллисекунду?
Может потому что нужно чтобы реакция была моментальная? Я уже об этом выше написал, сейчас напишу ещё понятнее. Допустим задержка не 250 миллисекунд а 10 секунд. Ну вот такая, просто предположим. Чел зажал кнопку F:

C++
1
2
3
4
5
6
7
8
9
Нажатие правой кнопки мыши;
(проверка F: OK)
Отпускание правой кнопки мыши;
(проверка F: OK)
Задержка на 10 секунд в период который чел отпустил кнопку;
Чел ждёт, уже дошел до момента где макрос ему снова нужен и пытается яростно долбить по F))))
Задержка прошла;
(проверка F: НЕОК, прекращение работы)
// Еще какие-то нажатия которые могли бы быть но из-за отпускания кнопки должны прерваться
Мне же надо чтобы как только кнопка отпускается - сразу же идет завершение работы кода потока. Как я уже сказал выше, я мог бы при получении сообщения отжатия F сделать через TerminateThread, но везде пишут что так лучше не делать.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
27.09.2021, 23:25
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Чел ждёт, уже дошел до момента где макрос ему снова нужен и пытается яростно долбить по F))))
Ну и? У тебя как макрос запускается? Поток создается? Нормально опиши задачу. Просто создастся поток и все пойдет заново, а прошлый поток просто завершится; просто добавить доп проверку нужно ли завершить поток. Ну и задержку можно не "в лоб" делать, а правильно, к примеру через MsgWaitForMultipleObjects.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
27.09.2021, 23:32  [ТС]
The trick, При зажатии клавиши F создается поток в котором выполняются всякие нажатия с задержками. После того как клавиша F будет отпущена - поток должен моментально пасть смертью храбрых.

Цитата Сообщение от The trick Посмотреть сообщение
просто добавить доп проверку нужно ли завершить поток.
Если добавлять эту проверку в этот же поток, то задержка так же будет мешать.

Цитата Сообщение от The trick Посмотреть сообщение
Ну и задержку можно не "в лоб" делать, а правильно, к примеру через MsgWaitForMultipleObjects.
Я не понимаю как это.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
27.09.2021, 23:48
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
После того как клавиша F будет отпущена - поток должен моментально пасть смертью храбрых.
Почему он должен "пасть"? Он может оставаться в ожидании - это никому не мешает. Он проснется и завершится.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Если добавлять эту проверку в этот же поток, то задержка так же будет мешать.
Нет. При запуске потока, все выполняющиеся другие потоки маркируешь к удалению, они это тестируют перед тестированием состояния клавиши и завершаются при необходимости.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Я не понимаю как это.
Если у тебя создается поток на запуск макроса тебе это вообще не нужно. С MsgWaitForMultipleObjects это когда у тебя макрос в одном потоке работает с основной программой - поставил ожидание с нужным таймаутом и пробуждением по клавиатуре, и смотришь возвращаемое значение. Если там таймаут - то дальше выполняешь, если эвент - обрабатываешь и смотришь что там, если отпускание нужной клавиши - сбрасываешь иначе делаешь ожидание опять с учетом прошедшего времени. Все в одном потоке. Конечно и в многопоток можно его сделать тоже.
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
27.09.2021, 23:59  [ТС]
The trick, Простите, но Вы меня не понимаете. Возможно это моя вина.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2021, 23:59
Помогаю со студенческими работами здесь

Отмена действия, если форма была закрыта через крестик
Как сделать, чтобы если закрыли Form2 через крестик, не выполнялась процедура DrawPS ? begin Form2.ShowModal; DrawPS(X, Y,...

TreeView.Как определить на каком узле при перетаскивании была отпущена кнопка мыши?
Я пытаюсь сделать в TreeView возможнность перетаскивания узлов с изменением их подчиненности. Вот возникло несколько вопросов: 1. При...

Как сделать так чтобы если была допустим была единичка делалось одно, а если 2 то другое?
Как сделать так чтобы если была допустим была единичка делалось одно, а если 2 то другое. Я пытался както через StreamReader но моих мозгов...

определить какая клавиша была нажата
Подскажите пожалуйста как можно определить на KeyUP то, что был отпущен пробел???

В цикле проверить нажата ли была клавиша 8
Необходимо в цикле проверить нажата ли была клавиша 8, и что бы вывод сообщения fwweg во время проверки не останавливался. Тобишь у...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru