нужно примерно на 1 секунду затормозить срабатывание клавиши
мешает мгновенное выполнение
не пойму как перепроверить через время всё ещё нажата ли клавиша или уже нет
Как сделать задержку срабатывания нажатой клавиши
Сообщений 1 страница 17 из 17
Поделиться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
Завести поток, там поставить задержку а потом и код выполнения.
Поделиться1408.04.2025 15:22:55
последняя модернизация, но таки всё равно нет гарантии что не закроется ещё одно окно, но ложные закрытия уменьшились, теперь надо постараться
If SendMessage_(chk("esc1")\hwnd, #BM_GETCHECK, 0, 0)=#BST_CHECKED And GetForegroundWindow_()=ws\hwnd If timOut=#False And GetAsyncKeyState_(#VK_ESCAPE)=32768 timOut=#True AddWindowTimer(ws\num, 123, sESC) ElseIf timOut=#True And GetAsyncKeyState_(#VK_ESCAPE)=0 RemoveWindowTimer(ws\num, 123) timOut=#False ElseIf ev = #PB_Event_Timer And EventTimer() = 123 RemoveWindowTimer(ws\num, 123) timOut=#False Break EndIf EndIf
Поделиться1508.04.2025 16:57:30
Если у вас окно, то самым надёжным будет AddKeyboardShortcut() и он не будет распространять нажатие Esc на следующие окна, так как поглотит событие.
Поделиться1608.04.2025 17:21:21
Насчет нажатия Escape - я делал иначе.
Repeat ev=WaitWindowEvent() If GetAsyncKeyState_(#VK_ESCAPE)&32768;=-32767 Break EndIf Select ev Case #PB_Event_Menu Select EventMenu() Case 1: I$ = UCase( InputRequester("insert char", "enter number($ for hex)", "") ) While GetAsyncKeyState_(#VK_ESCAPE)&32768 Wend
Смысл в том, что после вызова Requester добавлен опрос нажатия той же клавиши - пользователь может нажать Escape, чтобы закрыть диалоговое окно, но это нажатие не должно распространиться на цикл опроса событий.
Поделиться1708.04.2025 18:05:59
сколько хозяек, столько борщей
посмотрим как твоя версия работает
Похожие темы
получить цвет фона окна | PureBasic для Windows | 08.04.2025 |