нужно примерно на 1 секунду затормозить срабатывание клавиши
мешает мгновенное выполнение
не пойму как перепроверить через время всё ещё нажата ли клавиша или уже нет
Как сделать задержку срабатывания нажатой клавиши
Сообщений 1 страница 13 из 13
Поделиться101.09.2024 13:42:37
Поделиться201.09.2024 16:23:52
Можно запустить таймер или поток и через нужное время проверить функцией GetKeyState нажата ли клавиша.
Поделиться302.09.2024 04:34:19
а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить
у меня огород получается и всё равно правильно не работает
Поделиться402.09.2024 15:46:18
а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить
В процедуре вызываемой таймером, отключаете его. Там же проверяете нажата ли кнопка.
Поделиться503.09.2024 14:22:02
Пётр, если бы я понял как это сделать, не стал бы спрашивать
так работает, но неправильно, срабатывает в разное время
а как сделать правильно, фантазия кончилась
EnableExplicit Procedure win() Protected ev OpenWindow(1234, 870, 640, 400, 300, "text") AddWindowTimer(1234, 123, 1000) Repeat ev=WaitWindowEvent() If GetAsyncKeyState_(#VK_ESCAPE)=32768 If ev = #PB_Event_Timer And EventTimer() = 123 Break EndIf EndIf Until ev=#PB_Event_CloseWindow EndProcedure win()
Поделиться603.09.2024 22:11:57
После нажатия кнопки, запускаете таймер. После срабатывания таймера, останавливаете его.
EnableExplicit Procedure win() Protected ev, TimOn=#False OpenWindow(1234, 870, 640, 400, 300, "text") Repeat ev=WaitWindowEvent(100) If TimOn=#False And GetAsyncKeyState_(#VK_ESCAPE)=32768 TimOn=#True AddWindowTimer(1234, 123, 1000) EndIf If ev = #PB_Event_Timer And EventTimer() = 123 RemoveWindowTimer(1234, 123) TimOn=#False Debug "Таймер" EndIf Until ev=#PB_Event_CloseWindow EndProcedure win()
Поделиться704.09.2024 06:25:44
спасибо, теперь как надо
флаг пробовал, запускать/удалять таймер пробовал, но почему то получался большой не работающий огород
Поделиться804.09.2024 09:16:12
у меня код немного отличался, изначально не туда свернул, потому и не работал
спасибо Пётр, показал куда надо идти
вот вариант API
EnableExplicit Global timer Procedure myCallback(hwnd, msg, wParam, lParam) Protected res res = #PB_ProcessPureBasicEvents Select msg Case #WM_CHAR If timer=#False And wParam=#VK_ESCAPE timer=#True SetTimer_(WindowID(1234), 123, 1000, 0) EndIf Case #WM_TIMER KillTimer_(WindowID(1234), 123) timer=#False End EndSelect; msg ProcedureReturn res EndProcedure Procedure win() Protected ev OpenWindow(1234, 870, 640, 400, 300, "text") SetWindowCallback(@MyCallback()) Repeat ev=WaitWindowEvent() Until ev=#PB_Event_CloseWindow EndProcedure win()
Поделиться905.09.2024 06:27:41
неправильный код, срабатывает при коротком нажатии, таймер то сразу запускается, надо его выключать если клавишу раньше отпустили
так заработало
Procedure win() Protected ev, TimOn=#False OpenWindow(1234, 870, 640, 400, 300, "text") Repeat ev=WaitWindowEvent(100) If TimOn=#False And GetAsyncKeyState_(#VK_ESCAPE)=32768 Debug "1 "+Bool(GetAsyncKeyState_(#VK_ESCAPE)=32768) TimOn=#True AddWindowTimer(1234, 123, 1000) ElseIf TimOn=#True And GetAsyncKeyState_(#VK_ESCAPE)=0 Debug "2" RemoveWindowTimer(1234, 123) TimOn=#False ElseIf ev = #PB_Event_Timer And EventTimer() = 123 Debug "3 "+Bool(GetAsyncKeyState_(#VK_ESCAPE)=32768) RemoveWindowTimer(1234, 123) TimOn=#False Break EndIf Until ev=#PB_Event_CloseWindow Debug "save" EndProcedure win()
Поделиться1019.09.2024 23:22:26
Функция
GetKeyState
эта и ей подобные вдруг стали популярными в последнее время
Поделиться1119.09.2024 23:28:17
а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить
у меня огород получается и всё равно правильно не работает
Используейте счетчики и флаги состояния, я когдато на контроллере писал прогу для дребезга контактов и анализа скорости
повторного ввода буквы при долгом нажатии кнопки. Помогло.
Если нажата кнопка то считаем количество времени, если прошо то зачет, меняем флаг и сокращаем время ожидания,
это делает повтор ввода буквы быстрее. Пустили клаву, флаги сбросили в исходное состояние.
Поделиться1219.09.2024 23:33:20
у меня код немного отличался, изначально не туда свернул, потому и не работал
Иногда полезно форматировать код проги, тогда видно начало и конец условий, циклов и пречего.
И ошибки иногда виднее.
Я про одступы в виде табуляций.
Поделиться1329.10.2024 18:32:35
Завести поток, там поставить задержку а потом и код выполнения.