1

Тема: AHK: Передать имя клавиши через переменную

Есть у меня код в котором много повторения, хочу избавится от этого индусского кода, обернув его повторения в функцию, но там нужно клавишу посылать типа: Send, +{sc20}, и я не знаю как тут быть.
Для наглядности, вот кусок повторения.

; Shift+A
+sc1E::
	if GetKeyState("RShift") {
		Send, +{sc1E}
		Return
	}
	MouseGetPos, MouseX, MouseY
	ClickOnButton(ApproachCoordX, ApproachCoordY)
	MouseMoveTo(MouseX, MouseY)
Return

; Shift+S
+sc1F::
	if GetKeyState("RShift") {
		Send, +{sc1F}
		Return
	}
	MouseGetPos, MouseX, MouseY
	ClickOnButton(WarpCoordX, ApproachCoordY)
	MouseMoveTo(MouseX, MouseY)
Return

; Shift+D
+sc20::
	if GetKeyState("RShift") {
		Send, +{sc20}
		Return
	}
	MouseGetPos, MouseX, MouseY
	ClickOnButton(JumpCoordX, ApproachCoordY)
	MouseMoveTo(MouseX, MouseY)
Return

А нужно сделать что-то вроде:

KeyAction(keycode, X, Y) {
	if GetKeyState("RShift") {
		Send, +{keycode}
		Return
	}
	MouseGetPos, MouseX, MouseY
	ClickOnButton(X, Y)
	MouseMoveTo(MouseX, MouseY)
}

; Shift+A
+sc1E::
	KeyAction(sc1E, ApproachCoordX, ApproachCoordY)
Return

; Shift+S
+sc1F::
	KeyAction(sc1F, WarpCoordX, ApproachCoordY)
Return

; Shift+D
+sc20::
	KeyAction(sc20, JumpCoordX, ApproachCoordY)
Return

Подскажите пожалуйста, как можно это сделать.

2 (изменено: Taveron, 2021-12-28 23:41:22)

Re: AHK: Передать имя клавиши через переменную


+sc20::KeyAction("sc20")

KeyAction(keycode) {
	Send, +{%keycode%}
}

3 (изменено: SeamenValcz, 2021-12-29 00:17:45)

Re: AHK: Передать имя клавиши через переменную

Taveron пишет:

+sc20::KeyAction("sc20")

KeyAction(keycode) {
	Send, +{%keycode%}
}

Да, точно, KeyAction("sc20") Нужны были кавычки! Я без них пробовал не работало. Спасибо.

В принципе, именно так мне и нужно, так оно и будет работать. Но появился ещё один вопрос на засыпку, чисто в образовательных целях.
Вот так работать не будет:

variable = sc20
+sc20::KeyAction(variable)

и так

variable = sc20
+sc20::KeyAction(%variable%)

и так

variable = "sc20"
+sc20::KeyAction(%variable%)

Немного не пойму синтаксис, хотя я ещё только начал изучать AHK, даже до темы функций не дошёл. В передаче аргументов нельзя использовать выражения а %variable% это выражение?

4 (изменено: Taveron, 2021-12-29 00:22:19)

Re: AHK: Передать имя клавиши через переменную

Первый вариант работает, просто добавьте функцию.


variable = sc20

+sc20::KeyAction(variable)

KeyAction(keycode) {
	Send, +{%keycode%}
}

Почитайте о функциях в справке eng или ru.

5 (изменено: __Михаил__, 2021-12-29 00:39:06)

Re: AHK: Передать имя клавиши через переменную

Может проще сразу отправлять текущую клавишу:

+sc20::KeyAction2(SubStr(A_ThisHotkey,2))	; Shift + D
+sc1F::KeyAction2(SubStr(A_ThisHotkey,2))	; Shift + S

KeyAction2(k) {
 Send, +{%k%}
}
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Передать имя клавиши через переменную

Taveron

Первый вариант работает, просто добавьте функцию.

Странно, в моём коде не работало, в новом файле работало. Начал разбираться почему, оказалось потому что в начале моего файла есть:

;Убирает окно tooltip
RemoveToolTip:
	ToolTip
Return

Которую я взял из документации. Передвинул этот блок в самый низ файла всё заработало. Теперь сомневаюсь что такой способ убирать окно tooltip правильный.


__Михаил__
Спасибо, интересный вариант на изучение!

7

Re: AHK: Передать имя клавиши через переменную

__Михаил__, человек просто пытается понять как работают функции, а вы ему тут матрёшку предлагаете.

8

Re: AHK: Передать имя клавиши через переменную

Изучите азы - секция автовыполнения и 'Return'.

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

9 (изменено: SeamenValcz, 2021-12-29 01:05:27)

Re: AHK: Передать имя клавиши через переменную

__Михаил__ Да, я уже понял что дело тут в не понимании синтаксиса, потому что, оказывается так работает:

+sc20::
	variable = sc20
	KeyAction(variable)
Return

Или если variable = sc20 поместить в начале файла, тоже работает.


В общем, спасибо ещё раз за помощь. Пойду документацию читать.