Что нового

UserInput - Определение ввода пользователя

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
AutoIt: 3.2.10.0 - 3.3.12.0
Версия: 1.2

Категория: Автоматизация, Хуки

Описание: Получение ввода пользователя. Основана на стандартной UDF-функций _IsPressed().

Код/Пример:
Код:
#include <UserInput.au3>

HotKeySet('{ESC}', '_Quit')

While 1
	;[QWERT] it's a Group, a set of characters (equivalent to 'Q|W|E|R|T')
	;20 is a hex-value, wich is {Spacebar}.
	$aRead = _UserInput_Read('{CTRL}+S|20|[:ALPHA:]+[:ALLNUM:]|-|=|\|''|;|[QWERT]')
	
	If $aRead[0] Then
		_Output_Result($aRead[1])
	EndIf
	
	Sleep(10)
WEnd

Func _Output_Result($iKey)
	Local $sKeys = '', $aKeys = StringSplit($iKey, '+')
	
	;Formate the output
	For $i = 1 To $aKeys[0]
		$sKeys &= '{' & _UserInput_GetKeyString($aKeys[$i]) & '}'
		If $i < $aKeys[0] Then $sKeys &= '+'
	Next
	
	Local $sTT_Data = StringFormat('_UserInput_Read Return:\t%s (%s)', $iKey, $sKeys)
	ToolTip($sTT_Data)
EndFunc

Func _Quit()
	Exit
EndFunc

Файл: UserInput.zip

История версий:
v1.2 (09.02.2015)
* Библиотека переименована в UserInput и значительно переписана.
* Улучшена обработка возвращаемых значений (см. примеры).
* Изменена концепция использования функции (см. примеры).
* Множество исправлений.

v1.1 (25.03.2010)
+ Теперь функция возвращает hex-код нажатой клавиши (полезно при проверке нескольких клавиш).
* Поправки во внутренних функциях.
* Обновлены примеры.

v1.0 (29.01.2009)
Первая публичная версия.

Источник: UserInput UDF - Read user input
Автор(ы): G.Sandler (CreatoR)
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Классная библиотека! :laugh:

Написал скрипт на её основе который считает eAPM = effective actions per minute. Дословно эффективные действия в минуту. Отличается от APM тем, что не учитывает повторяющиеся клики мыши и нажатия клавиш.
Для геймеров довольно полезная штука.
Код:
#include <IsPressedEx.au3>
$apm=0
$TimerAPM = TimerInit()

HotKeySet("^q", "_Quit")


$hU32_DllOpen = DllOpen("User32.dll")
$iRet1 = 0

While 1
	$iRet = _IsPressedEx("[:ALLKEYS:]", $hU32_DllOpen)
	If $iRet Then 
        If $iret1 <> $iret then
        $apm +=1
        $iRet1 = $iRet
        EndIf
        ToolTip("eAPM: " & round($APM/(TimerDiff($TimerAPM)/1000/60)),0,0)
        EndIf
	Sleep(10)
WEnd

Func _Quit()
	DllClose($hU32_DllOpen)
       	Exit
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Совет. После вызова GetAsyncKeyState() лучше проверять системную ошибку, т.к. эта функция не работает при активации некоторых окон UI (UAC и т.д.).

Код:
Func __IsPressed($vkCode)

	Local $Ret = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', $vkCode)

	If (@error) Or ((Not $Ret[0]) And (_WinAPI_GetLastError())) Then
		Return SetError(1, 0, 0)
	EndIf
	Return BitAND($Ret[0], 0x8000)
EndFunc   ;==>__IsPressed
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Yashied [?]
Совет. После вызова GetAsyncKeyState() лучше проверять системную ошибку
Это ты где нашёл, в библиотеке нет такого. А в оригинальной _IsPressed() проверяется ошибка («If @error Then ...»).
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

CreatoR сказал(а):
Это ты где нашёл?

MSDN

А еще, я с этим столкнулся в HotKey UDF. Мы это несколько дней обсуждали на оффициальном форуме с Ascend4nt'ом и KaFu.

CreatoR сказал(а):
А в оригинальной _IsPressed() проверяется ошибка («If @error Then ...»).

Бессмысленно проверять только @error, когда функция и так присутствует во всех поддерживаемых AutoIt'ом версиях Windows. Нужно проверять результат функции.
 

Moonsin

Новичок
Сообщения
17
Репутация
2
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Библиотека не определяет нажатия на Sleep, Wake Up, Power на клавиатуре. Их нажатия как то можно отслеживать?
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Sleep можно:
Код:
HotKeySet('{SLEEP}', '_Sleep')

While 1
	Sleep(100)
WEnd

Func _Sleep()
	MsgBox(0, '', '')
EndFunc
 

Moonsin

Новичок
Сообщения
17
Репутация
2
Re: _IsPressedEx - Расширенная функция для определения нажатых клавиш

Спасибо, работает. А Power и Wake Up никак нельзя?
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Обновление...

v1.2 (09.02.2015)
* Библиотека переименована в UserInput и значительно переписана.
* Улучшена обработка возвращаемых значений (см. примеры).
* Изменена концепция использования функции (см. примеры).
* Множество исправлений.
 

Oki

Продвинутый
Сообщения
452
Репутация
62
Существует ли простой вариант при пользовании этим инструментом отключать ввод, всё ещё получая результат нажатия в скрипт?

А на будущее можно предложить добавить необязательный параметр функции, сообщающий ей о таком поведении. Типа такого.
Код:
$aRead = _UserInput_Read('[:ALLKEYS:]|[:ALLMOUSE:]') ; Получить ввод.
$aRead = _UserInput_Read('[:ALLKEYS:]|[:ALLMOUSE:]', 1) ; Перехватить ввод, блокируя его для других задач.
 
Верх