Что нового

[Мышь, клавиатура] [Мышь, клавиатура] Определить длительность нажатия клавиши

PoZiTiF

Новичок
Сообщения
9
Репутация
0
Здравствуйте, подскажите пожалуйста как можно узнать длительность нажатия клавиш. Нужно мне это для записи маршрута бота. То есть в итоге я буду получать такой текстовый файл примерно W 200, S 130 То есть двигаться вперёд в течении 200 миллисекунд, назад 150 миллисекунд. Сам никак не могу дойти, допустим повесили на клавишу обработчик нажали, вызвалась функция, и сколько раз она будет вызываться пока нажата клавиша ? Подскажите как сделать.

Подумал ещё, можно в цикле вызывать функцию и если клавиша нажата по TimerInit и TimerDiff определять сколько мс она была зажата. Не знаю на сколько это правильно и точно будет.

Код:
Func GetPressingWASD()
   $key=""
   $dll = DllOpen("user32.dll")
   While 1
	  Sleep ( 10 )
	  If _IsPressed("57", $dll) Then	; W
		 $key="W"
		 ExitLoop
	  EndIf
	  If _IsPressed("41", $dll) Then	; A
		 $key="A"
		 ExitLoop
	  EndIf
	  If _IsPressed("53", $dll) Then	; S
		 $key="S"
		 ExitLoop
	  EndIf
	  If _IsPressed("44", $dll) Then	; D
		 $key="D"
		 ExitLoop
	  EndIf
   WEnd
   DllClose($dll)
   Return $key
EndFunc
 
Автор
P

PoZiTiF

Новичок
Сообщения
9
Репутация
0
[Мышь, клавиатура] Re: [Мышь, клавиатура] [Мышь, клавиатура] Определить длительность нажатия клав

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

Выкладываю готовую функцию может кому пригодиться. Ожидает нажатия клавиши и возвращает символ нажатой клавиши и продолжительность нажатия. Можно было сократить функцию не зачем 4 практически идентичных блока писать, но это по быстрому так сказать )

Код:
;=============================================================================
; Ожидает нажатие одной из клавиш W,A,S,D и возращает
; клавишу и продолжительность её нажатия.
; $key[0] - "Клавиша" $key[1] - длительность нажатия миллисекунд
;=============================================================================
Func GetPressingWASD()
   Local $key[2]
   $dll = DllOpen("user32.dll")
   While 1

	  If _IsPressed("57", $dll) Then	; W
		 $key[0]="W"
		 While _IsPressed("57", $dll)
			Sleep(10)
			$key[1]+=10
		 WEnd
		 ExitLoop
	  EndIf

	  If _IsPressed("41", $dll) Then	; A
		 $key[0]="A"
		 While _IsPressed("41", $dll)
			Sleep(10)
			$key[1]+=10
		 WEnd
		 ExitLoop
	  EndIf

	  If _IsPressed("53", $dll) Then	; S
		 $key[0]="S"
		 While _IsPressed("53", $dll)
			Sleep(10)
			$key[1]+=10
		 WEnd
		 ExitLoop
	  EndIf

	  If _IsPressed("44", $dll) Then	; D
		 $key[0]="D"
		 While _IsPressed("44", $dll)
			Sleep(10)
			$key[1]+=10
		 WEnd
		 ExitLoop
	  EndIf
   WEnd

   DllClose($dll)
   Return $key
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,665
Репутация
2,463
Код:
#include <Misc.au3>

MouseDown('Left')
ToolTip('Click left mouse button to get some results')

$iTime = _IsPressedWait('01')

ToolTip('')
MsgBox(64, 'Title', 'Left mouse button was pressed about ' & Round($iTime/1000, 1) & ' seconds.')

Func _IsPressedWait($iKey, $iTimeout = 0)
	Local $iTimer = TimerInit()
	
	While _IsPressed($iKey)
		Sleep(10)
		
		If $iTimeout And TimerDiff($iTimer) >= $iTimeout Then
			ExitLoop
		EndIf
	WEnd
	
	Return TimerDiff($iTimer)
EndFunc
 
Автор
P

PoZiTiF

Новичок
Сообщения
9
Репутация
0
Да с TimerDiff мне действительно больше нравиться так как в моей функции кратно 10 мс только а это поворот юнита в 2 градуса почти, а тут точнее будет. Спасибо :smile:
 
Верх