PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Как сделать задержку срабатывания нажатой клавиши


Как сделать задержку срабатывания нажатой клавиши

Сообщений 1 страница 13 из 13

1

нужно примерно на 1 секунду затормозить срабатывание клавиши
мешает мгновенное выполнение
не пойму как перепроверить через время всё ещё нажата ли клавиша или уже нет

0

2

Можно запустить таймер или поток и через нужное время проверить функцией GetKeyState нажата ли клавиша.

0

3

а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить
у меня огород получается и всё равно правильно не работает

0

4

newJS написал(а):

а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить

В процедуре вызываемой таймером, отключаете его. Там же проверяете нажата ли кнопка.

0

5

Пётр, если бы я понял как это сделать, не стал бы спрашивать

так работает, но неправильно, срабатывает в разное время
а как сделать правильно, фантазия кончилась

Код:
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()

0

6

После нажатия кнопки, запускаете таймер. После срабатывания таймера, останавливаете его.

Код:
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()

0

7

спасибо, теперь как надо
флаг пробовал, запускать/удалять таймер пробовал, но почему то получался большой не работающий огород

0

8

у меня код немного отличался, изначально не туда свернул, потому и не работал
спасибо Пётр, показал куда надо идти :crazyfun:
вот вариант 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()

0

9

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

Код:
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()

0

10

Функция

Пётр написал(а):

GetKeyState

эта и ей подобные вдруг стали популярными в последнее время  :D

0

11

newJS написал(а):

а как таймер один раз запустить, и таймер должен сброситься если клавишу раньше отпустить
у меня огород получается и всё равно правильно не работает

Используейте счетчики и флаги состояния, я когдато на контроллере писал прогу для дребезга контактов и анализа скорости
повторного ввода буквы при долгом нажатии кнопки. Помогло.
Если нажата кнопка то считаем количество времени, если прошо то зачет, меняем флаг и сокращаем время ожидания,
это делает повтор ввода буквы быстрее. Пустили клаву, флаги сбросили в исходное состояние.

0

12

newJS написал(а):

у меня код немного отличался, изначально не туда свернул, потому и не работал

Иногда полезно форматировать код проги, тогда видно начало и конец условий, циклов и пречего.
И ошибки иногда виднее.

Я про одступы в виде табуляций.

0

13

Завести поток, там поставить задержку а потом и код выполнения.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Как сделать задержку срабатывания нажатой клавиши