1 (изменено: kamenschik, 2015-04-22 16:17:25)

Тема: А как сделать чтобы одним ярлыком запустить два разных скрипта?

У меня на геймпаде два джойстика. Всем известно что когда управляешь курсором через геймпадный джойстик либо скорость приходится делать маленькую ради точности, либо мирится с некоторой неуклюжестью при наведении. Я решил эту проблему тем что передрал скрипт делающий из геймпада мышь и внеся в него некоторые поправки сделал два разных скрипта. В одном работают оси XY в другом RZ.
Таким образом, когда запускаю оба скрипта, у меня гоняют курсор оба джойстика, но один быстрый, а другой медленный. Очень удобно. Подвожу быстро и потом нацеливаюсь в медленном режиме.

Проблема одна - в один скрипт вбить всё это нельзя - там дублируются некоторые команды, перестаёт работать.
Пробовал пронумеровать джойстики, чтобы не дублировались команды - почему-то остаётся работать только один.
А хочется запускать одним ярлыком.
Есть ли возможность на одном листе написать так чтобы запускалось с одного ярлыка, но машина понимала что это два разных скрипта, как при запуске с двух ярлыков?

2

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Сделайте ярлык на один скрипт, в нём первой строчкой пропишите запуск второго.

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

3 (изменено: kamenschik, 2015-04-22 16:32:48)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

teadrinker пишет:

Сделайте ярлык на один скрипт, в нём первой строчкой пропишите запуск второго.

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

4

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Объедините два в один.

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

5 (изменено: kamenschik, 2015-04-22 16:28:37)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

teadrinker пишет:

Объедините два в один.

Проблема в том что я не понял как сделать чтобы они не сливались вместе.
Копался-копался в переводе, не нашёл. Возможно что где-то там есть, но искать очень долго потому что перевод не очень удобно сделан.
Наверняка нужно просто поставить какой-то знак сверху и снизу в каждом.

Общался в предыдущей своей теме, из того что мне там посоветовали понял что скрипт можно запустить командой

q:=1

А как всю ту бороду приравнять к

q

?

Не знаю куда смотреть просто.

Можно ли в данном случае взять в качестве примера вот это:

Joy9::q:=1
#if q
Joy1::
q:=0
Send, {a}
KeyWait Joy1
return

Joy2::
q:=0
Send, {b}
KeyWait Joy2
return
#if

Или это совсем из другой песни?

6

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Так я не пойму, в чём ваш вопрос-то?

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

7 (изменено: kamenschik, 2015-04-22 16:32:05)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Я попытался написать первой строчкой:

q:=1

Потом вставил скрипт для первого джойстика.
Затем написал:

#if q

Скопировал скрипт для второго джойстика
и закрыл это:

#if

Пишет ошибку что дублируются команды.

8

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

kamenschik, у нас тут не вконтактик, приведите текст в порядок.

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

9

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

В первый скрипт можно прописать запуск второго командой Run.
Также вписать в первый, чтобы при закрытии скрипта, он закрывал второй - команды OnExit, WinClose, DetectHiddenWindows, SetTitleMatchMode.
Во втором прописать чтобы не было его видно в системном трее -  #NoTrayIcon.

10 (изменено: kamenschik, 2015-04-22 16:34:12)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

teadrinker пишет:

kamenschik, у нас тут не вконтактик, приведите текст в порядок.

Я думал что только целые скрипты нужно в рамки ставить, которые кто-то может взять себе. Просто как-то странно показалось выделять, если вопрос стоит: нужно ли ставить тут ":" или нет... И выделять это ":"
Но могу и поправить, не сложно.

11

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

А точки в конце предложений вам не сложно ставить?

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

12 (изменено: kamenschik, 2015-04-23 00:55:54)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

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

Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft

Причём не важно для какой кнопки: левой, правой или средней. Нужно чтобы хотя бы для одной было.
При этом вроде бы всё, что указывает на эти кнопки - убрал.
Решил проблему тем что оставил в скрипте для одного джойстика команду на левую клавишу, а во втором - на правую.
Хотя бы нет ненужных повторений.
Но странно, почему?
Вот эти два скрипта:

JoyMultiplier = 0.3

JoyThreshold = 3

InvertYAxis := false

ButtonLeft = 1

JoystickNumber = 1

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft

JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10

GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
IfInString, JoyInfo, P
    SetTimer, WatchPOV, 5
return


ButtonLeft:
SetMouseDelay, -1
MouseClick, left,,, 1, 0, D
SetTimer, WaitForLeftButtonUp, 10
return

WaitForLeftButtonUp:
if GetKeyState(JoystickPrefix . ButtonLeft)
    return
SetTimer, WaitForLeftButtonUp, off
SetMouseDelay, -1
MouseClick, left,,, 1, 0, U
return

WatchJoystick:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, joyx, %JoystickNumber%JoyX
GetKeyState, joyy, %JoystickNumber%JoyY
if joyx > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdUpper
}
else if joyx < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyx - JoyThresholdLower
}
else
    DeltaX = 0
if joyy > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdUpper
}
else if joyy < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyy - JoyThresholdLower
}
else
    DeltaY = 0
if MouseNeedsToBeMoved
{
    SetMouseDelay, -1
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
}
return

WatchPOV:
GetKeyState, POV, JoyPOV
KeyToHoldDownPrev = %KeyToHoldDown%
if POV < 0
    KeyToHoldDown =
else if POV > 31500
    KeyToHoldDown = Up
else if POV between 0 and 4500
    KeyToHoldDown = Up
else if POV between 4501 and 13500
    KeyToHoldDown = Right
else if POV between 13501 and 22500
    KeyToHoldDown = Down
else
    KeyToHoldDown = Left

if KeyToHoldDown = %KeyToHoldDownPrev%
    return

SetKeyDelay -1
if KeyToHoldDownPrev
    Send, {%KeyToHoldDownPrev% up}
if KeyToHoldDown
    Send, {%KeyToHoldDown% down}
return

и

JoyMultiplier = 0.015

JoyThreshold = 3

InvertZAxis := false

ButtonRight = 3

JoystickNumber = 1

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight

JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertZAxis
    ZAxisMultiplier = -1
else
    ZAxisMultiplier = 1

SetTimer, WatchJoystick, 10

ButtonRight:
SetMouseDelay, -1 
MouseClick, right,,, 1, 0, D
SetTimer, WaitForRightButtonUp, 10
return

WaitForRightButtonUp:
if GetKeyState(JoystickPrefix . ButtonRight)
    return 
SetTimer, WaitForRightButtonUp, off
MouseClick, right,,, 1, 0, U
return

WatchJoystick:
MouseNeedsToBeMoved := false
SetFormat, float, 03
GetKeyState, joyr, %JoystickNumber%JoyR
GetKeyState, joyz, %JoystickNumber%JoyZ
if joyr > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyr - JoyThresholdUpper
}
else if joyr < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := joyr - JoyThresholdLower
}
else
    DeltaX = 0
if joyz > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyz - JoyThresholdUpper
}
else if joyz < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := joyz - JoyThresholdLower
}
else
    DeltaY = 0
if MouseNeedsToBeMoved
{
    SetMouseDelay, -1
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * ZAxisMultiplier, 0, R
}
return

13 (изменено: Alectric, 2015-04-22 19:13:13)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Понятно, что ничего не понятно. (не вчитывался если честно).
Попробуй этот вариант.
Если нужно могу подкорректировать что-нибудь.


Под спойлерами код неудобно читать. И как цитаты тоже неудобно. Используй тег "code".

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

14

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

kamenschik, ещё раз как можно внимательнее прочитайте эту тему. Отредактируйте свои посты. Начинаю сомневаться в вашей адекватности.

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

15

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

kamenschik, ещё раз как можно внимательнее прочитайте эту тему. Особое внимание обратите на оформление кода. Отредактируйте свои посты.

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

16

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

yalanne пишет:

Вот что у меня получилось...

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

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

17 (изменено: kamenschik, 2015-04-23 01:05:42)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Malcev пишет:

Также вписать в первый, чтобы при закрытии скрипта, он закрывал второй - команды OnExit, WinClose, DetectHiddenWindows, SetTitleMatchMode.

Я нашёл в переводе про OnExit, но там так написано что начинающему трудно понять. Нет объяснения что такое ExitSub, зачем она нужна, что означает. (Эта команда стоит там в примере и пример к сожалению один, сравнить не с чем.) Пробовал написать от балды используя эту команду - не вышло, значит нужно разобраться со всем что там написано. Про ExitSub поискал по всему переводу - не нашёл.

18

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

yalanne пишет:

Вот что у меня получилось.

#Persistent
speed_stick1 = 10
speed_stick2 = 5

SetMouseDelay, -1
default := getkeystate("joyx","p")
settimer cursor_joy,1
return
cursor_joy:
DeltaX := getkeystate("joyx","p")
DeltaY := getkeystate("joyy","p")
DeltaU := getkeystate("joyu","p")
DeltaV := getkeystate("joyv","p")
Xmove := ((buf := (DeltaX != default) + ((DeltaV != default) ? 2 : 0)) and (buf=1) ? speed_stick1 : (buf>=2) ? speed_stick2 : 0), ((DeltaX < default) or (DeltaV < default)) and (Xmove*=-1)
Ymove := ((buf := (DeltaY != default) + ((DeltaU != default) ? 2 : 0)) and (buf=1) ? speed_stick1 : (buf>=2) ? speed_stick2 : 0), ((DeltaY < default) or (DeltaU < default)) and (Ymove*=-1)
if Xmove or Ymove
MouseMove, Xmove, Ymove, 0, R
return

У первого стика будет скорость передвижения мыши 10
У второго стика будет скорость передвижения мыши 5

Экспериментировал не совсем на джостике.
А на смартфоне эмулирующий джостик который по wifi передает ноуту команды джостика.

Возможно с настоящим будет работать не так как задумано.

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

19

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

teadrinker пишет:
yalanne пишет:

Экспериментировал не совсем на джостике.
А на смартфоне эмулирующий джостик который по wifi передает ноуту команды джостика.

Возможно с настоящим будет работать не так как задумано.

Курсор едет в верхний левый угол.

20 (изменено: yalanne, 2015-04-23 02:06:56)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Вот вторая версия:

#Persistent
speed_stick1 = 0.3
speed_stick2 = 0.09

SetMouseDelay, -1
default := Ceil(getkeystate("joyx","p"))
settimer cursor_joy,10
return
cursor_joy:
DeltaX := Ceil(getkeystate("joyx","p"))
DeltaY := Ceil(getkeystate("joyy","p"))
DeltaU := Ceil(getkeystate("joyu","p"))
DeltaV := Ceil(getkeystate("joyv","p"))
% (buf := (DeltaX != default) + ((DeltaV != default) ? 2 : 0))
Xmove := Ceil((default - ((buf=1) ? DeltaX : (buf>=2) ? DeltaV : "")) * ((buf=1) ? speed_stick1 : (buf>=2) ? speed_stick2 : 0))*-1
Ymove := Ceil((default - ((buf=1) ? DeltaY : (buf>=2) ? DeltaU : "")) * ((buf=1) ? speed_stick1 : (buf>=2) ? speed_stick2 : 0))*-1
if Xmove or Ymove
MouseMove, Xmove, Ymove, 0, R
return

в этой версии скорость надо указывать в дробях.

+ Как это работает
+ Строка 1
#Persistent

без этой строки скрипт сразу же закроется при запуске.

+ Строка 2-3
speed_stick1 = 0.3
speed_stick2 = 0.09

Скорость первого и второго стика. указывать дробью

+ Строка 5
SetMouseDelay, -1

уберает задержку у команды MouseMove

+ Строка 6
default := Ceil(getkeystate("joyx","p"))

в переменной default будет хранится начальная позиция стиков. по ходу работы скрипта эта переменная не меняется.С помощью Ceil число округляется в большую сторону.

+ Строка 7-8
settimer cursor_joy,10
return

каждые 10мс будет вызываться метка cursor_joy

+ Строка 10-13
DeltaX := Ceil(getkeystate("joyx","p"))
DeltaY := Ceil(getkeystate("joyy","p"))
DeltaU := Ceil(getkeystate("joyu","p"))
DeltaV := Ceil(getkeystate("joyv","p"))

записывает положение стиков.XY для первого и UV для второго

+ Строка 14
% (buf := (DeltaX != default) + ((DeltaV != default) ? 2 : 0))

В переменную buf записывается число от 1 до 3.Если цифра 1 то используется первый стик. Если 2-3 то второй стик

+ Строка 15-16
Xmove := Ceil((default - ((buf=1) ? DeltaX : (buf>=2) ? DeltaV : "")) * ((buf=1) ? speed_stick1 : (buf>=2) ? speed_stick2 : 0))*-1

X\Ymove хранится число на которое будет смещение курсора.
Из начальной позиции вычитает положение стика умножается на ту цифру скорости которая соответствует стику и умножает на -1 что бы стороны соответствовали.

+ Строка 17-18

Если новый x и y не равно нулю то курсор смещается

+ Строка 10

21

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Я нашёл в переводе про OnExit, но там так написано что начинающему трудно понять

Так понятней?

#Persistent
OnExit, ExitSub
return

ExitSub:
msgbox, скрипт закончил свою работу
ExitApp

22 (изменено: kamenschik, 2015-04-23 18:24:32)

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

Malcev пишет:

Так понятней?

Мне понятно что ExitSub имеет отношение к запуску msgbox и только, и очевидно не поможет мне закрыть скрипт для второго джойстика. И ещё то, что попытки записать:

OnExit, WinClose, Metro2033_2.ahk

Ровно как и:

OnExit, WinClose, Metro2033_2-Блокнот

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

23

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

У комманды OnExit только один параметр  - это метка, куда перейдет скрипт перед тем как прекратить работу.
То есть нужно создать метку и уже под ней вписать необходимые комманды.

24

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

yalanne пишет:

Вот вторая версия:

Всё равно уезжает, но я попробую переделать.
Ушёл думать.

25

Re: А как сделать чтобы одним ярлыком запустить два разных скрипта?

А едет при каких условиях?