1

Тема: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

Всем доброго времени суток. Прошу помочь мне в написании скрипта.
Игра - Sacred - старая бинды менять нельзя.
Необходимо поменять местами кнопки от 1 до 5 с кнопками 6 - 0. То есть 1->6, 2->7, 3->8, 4->9, 5->0, 6->1, 7->2, 8->3, 9->2, 0->1. Переключение должно происходить после нажатия на кнопку (например F2; или numlock, чтобы по включенному светодиоду знать когда вкл режим перестановки), при повторном нажатии выключать режим перестановки.

"Своими" усилиями из костылей был собран код, работает только 1->6, 2->7, 3->8, 4->9, 5->0 при попытках добавить 6->1, 7->2, 8->3, 9->2, 0->1 не работает вообще, что и не мудрено. 1::6 6::1 и тд работает прекрасно, но без подключения хуков не могу добавить кнопку переключения, а она нужна.


Сам код(неработающие участки закоменчены):

SW := 0		; Флаг режима 0-выключен, 1-включен
F2::		; F2 - Клавиша смены режима:
If (SW < 1)	; Меняет кнопки: 1..5 на 6..0, 6..0 на 1..5
{
 SW := 1		; Меняем флаг
 ToolTip, changed keys:`n1`t->`t6`n2`t->`t7`n3`t->`t8`n4`t->`t9`n5`t->`t0 ; `n6`t->`t1`n7`t->`t2`n8`t->`t3`n9`t->`t4`n0`t->`t5
 Hotkey, 1, 1_6	; Назначаем хук (перехват) клавиши 1
 Hotkey, 1, On	; Включаем его
 Hotkey, 2, 2_7	; Назначаем хук (перехват) клавиши 2
 Hotkey, 2, On	; Включаем его
 Hotkey, 3, 3_8	; Назначаем хук (перехват) клавиши 3
 Hotkey, 3, On	; Включаем его
 Hotkey, 4, 4_9	; Назначаем хук (перехват) клавиши 4
 Hotkey, 4, On	; Включаем его 
 Hotkey, 5, 5_0	; Назначаем хук (перехват) клавиши 5
 Hotkey, 5, On	; Включаем его
; Hotkey, 6, 6_1	; Назначаем хук (перехват) клавиши 6
; Hotkey, 6, On	; Включаем его
; Hotkey, 7, 7_2	; Назначаем хук (перехват) клавиши 7
; Hotkey, 7, On	; Включаем его
; Hotkey, 8, 8_3	; Назначаем хук (перехват) клавиши 8
; Hotkey, 8, On	; Включаем его
; Hotkey, 9, 9_4	; Назначаем хук (перехват) клавиши 9
; Hotkey, 9, On	; Включаем его
; Hotkey, 0, 0_5	; Назначаем хук (перехват) клавиши 0
; Hotkey, 0, On			; Включаем его
}
Else	; Выключает хук кнопок, делая их снова стандартными.
{
 SW := 0				; Меняем флаг
 ToolTip, Keys set to normal	
 Hotkey, 1, Off	; Выключаем хук 1
 Hotkey, 2, Off	; Выключаем хук 2
 Hotkey, 3, Off	; Выключаем хук 3
 Hotkey, 4, Off	; Выключаем хук 4
 Hotkey, 5, Off	; Выключаем хук 5
; Hotkey, 6, Off	; Выключаем хук 6
; Hotkey, 7, Off	; Выключаем хук 7
; Hotkey, 8, Off	; Выключаем хук 8
; Hotkey, 9, Off	; Выключаем хук 9
; Hotkey, 0, Off	; Выключаем хук 0
}
Sleep, 2000
ToolTip
Return


1_6:
Send, 6
Return

2_7:
Send, 7
Return

3_8:
Send, 8
Return

4_9:
Send, 9
Return

5_0:
Send, 0
Return

6_1:
Send, 1
Return

;7_2:
;Send, 2
;Return

;8_3:
;Send, 3
;Return

;9_4:
;Send, 4
;Return

;0_5:
;Send, 5
;Return

Прошу помочь, стало уже делом принципа победить данную проблему, сам разобраться с AHK не могу.

2

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

Промежуточный результат:

; Скрипт доведен до ума
; запускает/закрывает скрипт, меняющий клавиши: 1..5 на 6..0, 6..0 на 1..5 местами, по нажатию клавиши смены режима

SW := 0							; Флаг режима 0-выключен, 1-включен (менять не нужно)

F2::							; F2 - Клавиша смены режима

If (SW < 1)						; Проверяем флаг на запуск скрипта смены клавиш
{
 SW := 1						; Меняем флаг
 ToolTip, changed keys:`n1 . . 5`t->      6 . . 0`n6 . . 0`t->      1 . . 5	; Отобразить подсказку, накидал пробелов вместо таб, т.к. по одному таб с каждой стороны от -> отображалось не симметрично
run D:\AHK\123.ahk				; Запускаем скрипт по смене клавиш
Else							; Закрывает скрипт смены клавиш, делая их снова стандартными
{
 SW := 0						; Меняем флаг
 ToolTip, Keys set to normal	; Отобразить подсказку
ScriptFileName := "123.ahk"  	; написать название файла целевого скрипта для закрытия
SetTitleMatchMode, 2
DetectHiddenWindows, On
WinClose, % ScriptFileName " ahk_class AutoHotkey"	; Выключаем скрипт по смене клавиш
}
Sleep, 3000
ToolTip
Return

Скрипт запускает следующий:

; Скрипт по смене кнопок  
	1::6
	2::7
	3::8
	4::9
	5::0
	6::1
	7::2
	8::3
	9::4
	0::5

На данном этапе у меня 2 вопроса: как сделать одним файлом (изначальный вопрос), и как при привязке макроса к Numlock, а не F2, эмитировать его реальное нажатие, для напоминания через светодиод (да и по фану просто)?

3

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

Не легче ли использовать такой вариант, когда скрипт просто переназначает клавиши строго в этой игре, всегда и без какой либо лишней команды? Я так пользуюсь.

#IfWinActive, Название_игры ahk_class Класс_игры

1::6
2::7
3::8
4::9
5::0
6::1
7::2
8::3
9::4
0::5

#If

4 (изменено: NerasW, 2020-12-27 01:20:26)

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

__Михаил__
Легче, только не понял, как заполнять Класс_игры и тд, нужно ли писать путь к игре в названии, или нужно название окна? 1 сутки изучаю AHK, поэтому если можно приведите пример.
Также замечу, что основной вопрос меня интересует чтобы понять принцип. Я видел, что такие примеры реализуемы, но либо через цвет пикселя, либо по другим триггерам и адаптировать я их не смог под свой вариант.

5

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

NerasW

Можно так определить.

F2::
GoSub, фокус
Txt := "Название: " Title "`nКласс: " Class "`nКонтрол: " Control "`nID: " ID
ToolTip, % Txt		; Отобразить инфу
ClipBoard := Txt	; Сохранить инфу в буфер.
Return

фокус:	; Получить информацию о текущем окне:
MouseGetPos,,,ID, Control		; Получаем ID окна и Контрол.
WinGetClass, Class, Ahk_ID %ID%		; Получаем класс.
WinGetTitle, Title, Ahk_ID %ID%		; Получаем титул (имя / название).
WinActivate, Ahk_ID %ID%		; Активируем окно по ID.
Return

~Esc::	ToolTip	; Убрать ToolTip, чтобы не мешало.

6 (изменено: __Михаил__, 2020-12-27 03:05:47)

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

Очень советую почитать IfWinActive / IfWinNotActive. Там есть примеры.

Если нужно включать и выключать по кнопке - можно использовать проверку переменной и активацию участка кода.

Вот способ активации перехвата по F2. Смещённое нажатие цифр:

SW := 0		; Флаг перехвата клавиш (0:выкл. 1:вкл.)

; Установить хук на клавиши, по умолчанию выключен перехват.
KeySet:		; Метка для дальнейшего вызова:
Loop, 9
 Hotkey, % "$" A_Index, KSend, % (SW ? "On" : "Off"), UseErrorLevel
Hotkey, $0, KSend, % (SW ? "On" : "Off"), UseErrorLevel	; Клавишу 0 отдельно (в цикле не выйдет - 10 кнопки не существует).
Return


;Метка, которая выполняет посылку нажатий:
KSend:
Key := SubStr(A_ThisHotkey, 2)	; Извлечь 2 символ, т.е. саму клавишу, которая запустила метку.	
KeyWait, %Key%, U	; Ожидать отпуск клавиши.

I := Key > 4 ? Key-5 : Key+5
SendInput, % I
Tool("Key: " Key "`nI: " I,,0,0)
Return

F2::
SW := !SW	; Поменять значение (0=1 / 1=0).
GoTo, KeySet	; Запустить метку, которая переключит перехват клавиш.
Return



;05:44 19.07.2020 ToolTip на время:
; Wait = таймер если != 0, иначе ожидает отжатия клавиши.

Tool(Text, Wait := 1000, X := "", Y := "")
{
 SetTimer, T_Off, Off
 ToolTip, % Text, %X%, %Y%

 If Wait
  SetTimer, T_Off, % Wait
 Else
 {
  KeyWait, %A_ThisHotkey%, U
  ToolTip
 }
}


T_Off:
SetTimer, T_Off, Off
ToolTip
Return

7

Re: Помогите довести ПЕРЕКЛЮЧАЕМЫЙ СКРИП ПО ЗАМЕНЕ КНОПОК до ума.

__Михаил__ огромное вам спасибо!