1 (изменено: RacalCucumber, 2024-06-25 22:57:25)

Тема: AHK: Синтаксис GetKeyState

Доброго дня всем.

Есть фрагмент кода:


StopCast = 1
loop 30 
			{
				if not GetKeyState("d", "p")
				{
					StopCast = 0
					Break
				}
				Sleep, 10	
			}

Он ждет 0.3 секунды нажатия кнопки D и выставляет StopCast = 1 или если клавишу недодержали то StopCast = 0

Все понятно, все работает.

Теперь вопрос. Как сделать, чтобы проверялась не именно кнопка "D" а назначаемая переменная кнопка?

Потому что если сделать так:


StopCast = 1
loop 30 
			{
				if not GetKeyState(%temp%, "p")
				{
					StopCast = 0
					Break
				}
				Sleep, 10	
			}

Как бы я не пытался назначить переменную temp
temp = d
temp :=d
temp = "d"
temp := "d"

проверка на удержание не проходит уже в первом же цикле. Я что-то делаю не так или синтаксис  GetKeyState(%temp%, "p") вообще не поддерживается и
нужно делать через:


StopCast = 1
loop 30 
{
	GetKeyState, OutputVar, %temp%, P
	If OutputVar = U
		{
				StopCast = 0
				Break
		}
	Sleep, 10	
}

?

2

Re: AHK: Синтаксис GetKeyState

Читайте в справке разделы "Переменные и выражения" и "Функции".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: __Михаил__, 2024-06-26 00:37:59)

Re: AHK: Синтаксис GetKeyState

Пример для тестов нажатых клавиш. В список можно добавить сколько угодно дополнительно. Если нажать первую - прервать цикл отображения. Справа от клавиши её статус (0:Не зажато, 1:Зажато).

ListKey := ["q", "w", "e", "a", "s", "d"]	; Список необходимых клавиш.
Return

F2::	; Запуск проверки нажатых клавиш:
Start := 1
While(Start = 1){
 If GetKeyState(ListKey[1], "p")
  Start := 0
 T := ""
 Loop, % ListKey.Count()
  T .= ListKey[A_Index] ": " GetKeyState(ListKey[A_Index], "p") "  "
 ToolTip, % T
 Sleep, 300
}
ToolTip
Return

Описание работы от ChatGPT:

Этот код на языке AutoHotkey предназначен для создания скрипта, который отслеживает состояние нажатия клавиш. Вот как он работает:

ListKey := ["q", "w", "e", "a", "s", "d"] - Создает массив ListKey, содержащий список клавиш для отслеживания ("q", "w", "e", "a", "s", "d").

F2:: - Это метка, связанная с клавишей F2. Код ниже будет выполняться при нажатии на F2.

Start := 1 - Устанавливает переменную Start в 1, чтобы начать выполнение цикла.

While(Start = 1){ ... } - Бесконечный цикл, который выполняется, пока Start равно 1.

If GetKeyState(ListKey[1], "p") - Проверяет состояние нажатия первой клавиши из списка ListKey. Если она нажата ("p" - нажата), то Start устанавливается в 0, что прерывает выполнение цикла.

T := "" - Очищает строку T, которая будет содержать состояния клавиш.

Loop, % ListKey.Count() - Цикл, перебирающий все элементы массива ListKey.

T .= ListKey[A_Index] ": " GetKeyState(ListKey[A_Index], "p") "  " - Добавляет к строке T информацию о состоянии каждой клавиши из массива ListKey.

ToolTip, % T - Выводит всплывающую подсказку с текущим состоянием клавиш.

Sleep, 300 - Приостанавливает выполнение скрипта на 300 миллисекунд (0.3 секунды).

ToolTip - Закрывает всплывающую подсказку после выхода из цикла.

Return - Завершает выполнение обработчика события нажатия F2.

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

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Синтаксис GetKeyState

__Михаил__
Боюсь, вы только запутали ТС. Без массивов никак? Он не знает, что такое переменная, а вы ему массивы подсовываете.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5 (изменено: RacalCucumber, 2024-06-26 15:01:39)

Re: AHK: Синтаксис GetKeyState

У меня просто очень скромный опыт программирования через самообучение. Состоящий из программируемых микрокалькуляторов, базового бейсика и макроассемблера для Microchip и Atmel и LUA для Logitech. Там синтаксис для обозначения переменных и их типов общий во всех случаях. А не меняется произвольно от момента к моменту практически без упоминания об этом в документации к языку. Как тут. Когда во всех случаях переменную надо заключать в %% за исключением случаев с функциями. Причем ни в одной из статей документации в разделе "функции" об этом не сказано ни слова и не приведено ни одного примера. 

И логика, как я уже раньше писал, выходит в окно.

6

Re: AHK: Синтаксис GetKeyState

RacalCucumber, используйте, пожалуйста, заглавные буквы в начале предложений.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Синтаксис GetKeyState

RacalCucumber пишет:

У меня просто очень скромный опыт программирования через самообучение. Состоящий из программируемых микрокалькуляторов, базового бейсика и макроассемблера для Microchip и Atmel и LUA для Logitech.

Ничего себе, скромный опыт! У меня из вышеназванного только калькуляторы.

RacalCucumber пишет:

Причем ни в одной из статей документации в разделе "функции" об этом не сказано ни слова и не приведено ни одного примера.

Ну как же, а вот:

Since a function call is an expression, any variable names in its parameter list should not be enclosed in percent signs. By contrast, literal strings should be enclosed in double quotes. For example:

if InStr(MyVar, "fox")
    MsgBox The variable MyVar contains the word fox.

Вот даже есть перевод, хотя он и для совсем старых версий, но в данном случае актуален.

RacalCucumber пишет:

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

В этом вы отчасти правы (если не считать второй половины сказанного. В справке всегда указывается, является ли описываемый случай выражением, а в выражениях знаки процента не нужны). Поэтому лучше сейчас изучать AHK v2, там гораздо более предсказуемый синтаксис.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Синтаксис GetKeyState

teadrinker На мой взгляд наоборот пример не плох - список содержит строки клавиш. В функцию отправляется прямиком из него по одному. Плюс ко всему прочему список изменить легко без поломки логики скрипта. На всякий случай добавил описание от бота, он с этим неплохо справился.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

9

Re: AHK: Синтаксис GetKeyState

Сам по себе пример нормальный. Но какое отношение он имеет к вопросу? Вопрос был, как передать переменную в функцию.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Синтаксис GetKeyState

Не проблема:

ListKey := ["q", "w", "e", "a", "s", "d"]	; Список необходимых клавиш.
Return

F2::	; Запуск проверки нажатых клавиш:
Start := 1
While(Start){
 Temp := ListKey[1]	; Отдельно в переменной храним строку первой клавиши, но зачем? Чисто для примера разве.
 Start := !GetKeyState(Temp, "p")	; Проверяем состояние клавиши, записываем ОБРАТНЫЙ результат в переменную 'Start', дабы работал цикл.

 T := ""
 Loop, % ListKey.Count(){
  Temp := ListKey[A_Index]
  T .= Temp ": " GetKeyState(Temp, "p") "  "
 }

 ToolTip, % T
 Sleep, 300
}
ToolTip
Return

От бота:

F2:: начинает блок кода, который выполняется при нажатии клавиши F2.
Start := 1 устанавливает переменную Start в 1, запуская цикл While.
While(Start){ ... } создает бесконечный цикл, который будет выполняться, пока Start равно 1.
Temp := ListKey[1] сохраняет первую клавишу из списка ListKey в переменную Temp. Это делается, но на самом деле эта строка не нужна для функциональности программы.
Start := !GetKeyState(Temp, "p") проверяет состояние клавиши, сохраненной в Temp. GetKeyState(Temp, "p") возвращает 1, если клавиша нажата, и 0, если не нажата. !GetKeyState(Temp, "p") инвертирует это значение, поэтому Start становится 0, когда клавиша нажата, что завершает цикл.
Loop, % ListKey.Count() начинает цикл, который перебирает все элементы массива ListKey.
Temp := ListKey[A_Index] сохраняет текущий элемент массива в переменную Temp.
T .= Temp ": " GetKeyState(Temp, "p") "  " создает строку T, содержащую информацию о состоянии каждой клавиши из списка ListKey.
ToolTip, % T выводит всплывающую подсказку с текущим состоянием клавиш.
Sleep, 300 приостанавливает выполнение скрипта на 300 миллисекунд.
ToolTip закрывает всплывающую подсказку после окончания цикла.
Return завершает обработчик горячей клавиши F2.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

11

Re: AHK: Синтаксис GetKeyState

На самом деле код кривоватый. Не стоит доверять AI написание AHK-кода. Точнее, можно это делать, но лишь для того, чтобы он подкинул идею, но не для бездумного копирования.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12 (изменено: __Михаил__, 2024-06-27 19:15:06)

Re: AHK: Синтаксис GetKeyState

teadrinker Код мой, полностью. Боту только описание доверил. Если бы RacalCucumber указал более качественные примеры, может бы решил иначе составить код.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

13

Re: AHK: Синтаксис GetKeyState

Тогда извиняюсь перед ChatGPT.
Проще так:

ListKey := ["q", "w", "e", "a", "s", "d"]	; Список необходимых клавиш.
Return

F2::
while !GetKeyState("q") {
    t := ""
    for k, v in ListKey {
        t .= v . ": " . GetKeyState(v, "p") . " "
    }
    ToolTip % t
    Sleep 300
}
ToolTip
Return

Но вообще проверять состояние клавиш в цикле не очень хорошая идея, для этого есть Input или InputHook.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Синтаксис GetKeyState

teadrinker Не спорю, легче Хук установить какой на нужные клавиши и не париться. Ждём ТС с его комментариями.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

15

Re: AHK: Синтаксис GetKeyState

teadrinker пишет:

Не стоит доверять AI написание AHK-кода. Точнее, можно это делать, но лишь для того, чтобы он подкинул идею, но не для бездумного копирования.

https://claude.ai уже получше код для второй версии генерирует.

16

Re: AHK: Синтаксис GetKeyState

Попробую. Да и ChatGPT 4o может нормально писать, но лучше ему пример синтаксиса сразу в чате привести.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17 (изменено: RacalCucumber, 2024-06-28 14:29:08)

Re: AHK: Синтаксис GetKeyState

teadrinker пишет:

Но вообще проверять состояние клавиш в цикле не очень хорошая идея, для этого есть Input или InputHook.

не очень хорошая чем? Потребляемыми ресурсами или временем отклика?

В моем случае есть нюанс. Время длительности удержания клавиши, как вы заметили, достаточно маленькое, исчисляемое в лучшем случае пятью циклами sleep, 10. Я как-то пробовал использовать функцию keywait (в другом месте и по другому поводу) с опцией таймаута и у меня возникло ощущение, что на значениях менее секунды оно не работает так, как должно. По крайней мере не так, как ожидается. Поэтому я как бы стараюсь избегать в данных случаях использования команд с опцией Tхх со значениями менее секунды.

А так да, весь цикл заменяется одним keywait и условием if ErrorLevel {....}

18

Re: AHK: Синтаксис GetKeyState

RacalCucumber пишет:

не очень хорошая чем?

Если в цикле есть пауза, то есть риск, что нажатие попадёт на паузу; если паузу не делать, то будет грузить процессор.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19 (изменено: RacalCucumber, 2024-06-28 16:26:23)

Re: AHK: Синтаксис GetKeyState

teadrinker пишет:

Если в цикле есть пауза, то есть риск, что нажатие попадёт на паузу; если паузу не делать, то будет грузить процессор.

А, вы имеете в виду другой пример, где отсчитывается пауза в 300мс(sleep, 300). Да, это не самое лучшее решение.

В моем случае цикл ждет отпускания кнопки. Шансов, что кто-то осилит отпустить и нажать кнопку со скоростью более 10мс (sleep, 10) довольно мала. И в любом случае далее код все равно проверяет через PixelGetColor состояние элемента управления в игре, поэтому даже ошибочное срабатывание не приведет к десинхронизации между игрой и скриптом.

20

Re: AHK: Синтаксис GetKeyState

Теперь бы мне еще понять, что такое этот самый хук...

21

Re: AHK: Синтаксис GetKeyState

Клавиатурный хук реализуется в Input и InputHook().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

22

Re: AHK: Синтаксис GetKeyState

RacalCucumber Опишите что делает скрипт, в какой момент нужно ожидать от пользователя реакцию (нажатие клавиши). Возможно цикл будет не нужен вообще.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

23 (изменено: RacalCucumber, 2024-06-28 20:04:22)

Re: AHK: Синтаксис GetKeyState

Похоже, что с KeyWait и его работой на малых значениях таймаута я был неправ. Все он нормально и стабильно работает и цикла действительно не нужно. Видимо нестабильная работа KeyWait была вызвана хаотичной работой предыдущей "разработки"...

Отслеживается нажатие кнопок HK_Left и HK_Right, кнопок поворота техники (обычно A и D)
Если длительность нажатой кнопки больше определенного значения (Slide_var_decimal) - скрипт проверяет, попадает ли цвет индикатора режима подвески в диапазон тонов, соответствующий ВКЛЮЧЕННОМУ скоростному режиму работы подвески и если да - то кликает кнопкой HK_Gidro, переводя подвеску из скоростного режима в режим маневрирования. После чего ожидает отпускания кнопки K_Left и HK_Right.

При отпускании кнопок или если кнопки удерживались меньше определенного значения (Slide_var_decimal), скрипт проверяет цвет индикатора подвески на включенный режим маневрирования и если попадает в тон, то кликает кнопкой HK_Gidro, переводя подвеску из режима маневрирования ОБРАТНО в скоростной режим.

Суть сейчас это выглядит вот так,
Функция вызываемая Ноткеу

KeyL()
{
	If !GetKeyState(HK_Right, "p")
	{
		KeyWait %HK_Left%, T%Slide_var_decimal%
		if ErrorLevel
		{
			PixelGetColor, col, % posX, % posY, Alt
			If (var_max_on > col) and (var_min_on < col)
			{
				SendInput {%HK_Gidro%}
			}
			KeyWait, %HK_Left%
			sleep, 300
		}
		PixelGetColor, col, % posX, % posY, Alt
		If (var_max_off > col) and (var_min_off < col)
		{
			SendInput {%HK_Gidro%}
		}
	}
}

и вторая такая же функция и Hotkey на кнопку поворота вправо.

Sleep, 300 - это внутреннее КД в игре при переводе в скоростной режим.

24

Re: AHK: Синтаксис GetKeyState

Malcev пишет:

https://claude.ai уже получше код для второй версии генерирует.

OFF: Потестил, да не, не особо хорошо пока что. Тоже несуществующий синтаксис выдумывает.
Кстати, зарегиться из России тот ещё квест. Если кто любит головоломки, попробуйте.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder