Что нового

_WasPressed - Проверка нажатия клавиш без постоянного сканирования

Naisho

Знающий
Сообщения
86
Репутация
12
AutoIt: 3.3.8.1
Версия: 1.0

Категория: Вспомогательные функции, Мышь, Клавиатура

Описание:
Модификация стандартной "IsPressed()". В отличие от неё возвращает не факт нажатия некой клавиши в момент вызова функции, а факт того, что клавиша нажималась с момента последнего вызова функции.
Весьма полезно, если нет возможности сканировать состояние клавиатуры/мышы достаточно часто (чаще чем порядка 0,2 секунды), а по возврату из подпрограммы/завершению цикла нужно знать, нажималась ли какая то клавиша.

Код:
Код:
Func _WasPressed($sHexKey, $vDLL = 'user32.dll')
    Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey)
    If @error Then Return SetError(@error, @extended, False)
    Return BitAND($a_R[0], 0x0001) <> 0
EndFunc

Пример:
Код:
#include <Misc.au3>
Local $hDLL = DllOpen("user32.dll")

_WasPressed("", $hDLL)

While 1
    _MySubFunction(888)
	If _WasPressed("20", $hDLL) Then ConsoleWrite("_WasPressed - была нажата клавиша Пробел." & @CRLF)
	If _IsPressed("20", $hDLL) Then ConsoleWrite("_IsPressed - нажата клавиша Пробел." & @CRLF)
	If _WasPressed("10", $hDLL) Then ConsoleWrite("_WasPressed - была нажата клавиша Shift." & @CRLF)
	If _IsPressed("10", $hDLL) Then ConsoleWrite("_IsPressed - нажата клавиша Shift." & @CRLF)

	If _WasPressed("1B", $hDLL) Then
		ConsoleWrite("_WasPressed - была нажата клавиша ESC выход" & @CRLF)
		ExitLoop
	EndIf
WEnd
DllClose($hDLL)
Exit

Func _MySubFunction($t)
	Sleep($t)
EndFunc

Func _WasPressed($sHexKey, $vDLL = 'user32.dll')
    Local $a_R = DllCall($vDLL, "short", "GetAsyncKeyState", "int", '0x' & $sHexKey)
    If @error Then Return SetError(@error, @extended, False)
    Return BitAND($a_R[0], 0x0001) <> 0
EndFunc

Источник: autoit-script.ru
Автор(ы): Naisho :-\
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Naisho [?]
Тут нужно указать имя автора, на случай если данное сообщение будет публиковаться где то ещё.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Блестяще, учитывая увеличение паузы дабы не нагружать ЦП. :smile:
А если указать массив с полным перебором кнопочек(с учетом мышки) на производительность не повлияет?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
ИМХО, не надежно это: MSDN
Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application.
Хотя самый младший значащий бит возвращаемого значения и указывает, была ли клавиша нажата начиная с последнего запроса, но благодаря природе приоритетной многозадачности Windows, другое приложение может вызвать функцию GetAsyncKeyState и принять "недавно нажатый" бит вместо вашей программы.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
есть еще момент - если до запуска скрипта нажать клавишу, за которой будет следить скрипт, то он запишет, что клавиша была нажата. а если скрипт - это наша программа, то это будет ложное срабатывание.
 
Верх