1

Тема: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Добрый день. Есть задача назначить на педали от руля клавиши типа - или Ctrl. Проблема заключается в том что при нажатии педали скорость автоповтора вводимой клавиши зашкаливает. В 2-3 раза быстрее обычного автоповтора, из-за чего не может выполнять возложенные на неё функции (т.к. активируемые ей индикаторы просто мерцают с огромной скоростью).

Пытался решить проблему так:

Loop
{
GetKeyState, YJ, JoyY
If (YJ < 040)
Send {- down}
KeyWait JoyY
Send {- up}
}

И так:

Loop
{
GetKeyState, YJ, JoyY
If (YJ < 040)
Send {- down}
If (YJ > 040)
Send {- up}
}

Таким образом нужный мне результат достигался, но к сожалению по какой-то причине переставали работать все клавиши-модификаторы. То есть Ctrl, Shift, Alt и прочие начинали посылаться в приложение тоже в виде автоповторяющихся нажатий, что делало полностью невозможным свернуться по Alt+Tab или просто набрать предложение с большой буквы. Как можно исправить эту проблему? Может быть здесь уже были готовые скрипты для этой задачи (проверял поиск по "JoyY" и "Педали", но не было ничего подходящего)? Спасибо.



P.S. В таком варианте клавиши-модификаторы нормально работали:

Loop
{
GetKeyState, YJ, JoyY
If (YJ < 040)
Send {-}
}

Но к сожалению результат сводился на нет из-за зашкаливающей скорости автоповтора.

2 (изменено: Indomito, 2012-03-22 12:13:56)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Для начала попробуй заменить Send на SendPlay
Я по сути сегодня сел делать тоже самое, правда я обрабатываю по таймеру и оси (оси уж точно) и кнопки.
А пример это два файла JoystickMouse.ahk и JoystickTest.ahk, они есть в chm оригинальный/английский вариант.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

3 (изменено: creature.ws, 2012-03-22 13:30:46)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Если использовать {Blind}, тогда модификаторы не будут «отжиматься» перед отправкой идущей после {Blind} последовательности клавиш.

4 (изменено: Indomito, 2012-03-22 13:37:26)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

creature.ws пишет:

Если использовать {Blind}, тогда модификаторы не будут «отжиматься» перед отправкой идущей после {Blind} последовательности клавиш.

а можно пример, а?
Скажем первая кнопка джойстика модификатор, а вторая выдаёт два значения, ну скажем...

С модификатором Up без модификатора Down - в реализации удержания первой кнопки и нажатия на вторую.

C уважением.

P.S. Я просто тоже не смог написать, не так всё работает как надо, хотя с осями разобрался.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

5 (изменено: creature.ws, 2012-03-22 13:41:31)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Пример нельзя, джойстиком не располагаю, проверить не смогу
Исходя из того, что первые два примера в первом посте удовлетворяют нужды и единственная проблема это «невозможность зажать клавиши модификаторы» — решение вопроса темы:

Loop
{
GetKeyState, YJ, JoyY
If (YJ < 040)
Send {Blind}{- down}
KeyWait JoyY
Send {Blind}{- up}
}

6 (изменено: Indomito, 2012-03-22 13:56:24)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Не понял а зачем GetKeyState, YJ, JoyY это же проверка оси, а не клавиши или я чего то недопонимаю?
Или же просто что ось, что кнопка - без разницы?

И ещё как проще опрашивать по таймеру или же можно как обычную кнопку на клавиатуре?

P.S. Просто фокус с осью не пройдёт, а вот судя по справке можно использовать второй вариант(как обычную кнопку на клавиатуре), правда я не уверен.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

7 (изменено: creature.ws, 2012-03-22 14:40:00)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Indomito, извините, не смогу поддержать ваши размышления ответной репликой.

8

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

В конце концов сработал вот этот вариант:

Loop
{
GetKeyState, YJ, JoyY
If (YJ > 077)
SendPlay {Blind}{- down}
If (YJ < 077)
SendPlay {Blind}{- up}
}

Но начались странные аномалии, сводящие на нет любые преимущества. Все клавиши начали срабатывать с задержкой, модификаторы работают, но странно. Например Alt+Shift перестал переключать раскладку клавиатуры, а при попытке свернуть браузер левой кнопкой мыши курсор виснет на одном месте и отказывается двигаться, оживая только после Alt+Tab, который работает. Тем не менее в игре Alt+Shift работает (хотя все клавиши, как я уже говорил, работают с задержкой). Мистика. %)

9 (изменено: Indomito, 2012-03-22 15:49:25)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Попробуй вместо цикла использовать такую конструкцию.

#SingleInstance
#Persistent

JoystickNumber := 1
SetTimer, RightJoystick, 10  ; Для JoyX  и JoyY осей
SetTimer, LeftJoystick, 10  ; Для JoyZ  и JoyR осей

RightJoystick:
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX
GetKeyState, JoyY, %JoystickNumber%JoyY
; код обработки
return

LeftJoystick:
; аналогично RightJoystick:
return

и не забудь контролировать диапозон, ну скажем так например

JoystickNumber := 1
JoyZoneUp := 25
JoyZoneDn := 100 - JoyZoneUp
SetTimer, LeftJoystick, 10  ; Для JoyZ  и JoyR осей

LeftJoystick:
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX
GetKeyState, JoyY, %JoystickNumber%JoyY
{
OutJoyXY := "JoyX= " JoyX ",  JoyY= " JoyY ; Отладка
ToolTip  %OutJoyXY% ; Отладка
}
if JoyX < %JoyZoneUp%
 {
 SendPlay {Left}
 }
if JoyX > %JoyZoneDn%
 {
 SendPlay {Right}
 }
if JoyY < %JoyZoneUp%
 {
 SendPlay {Up}
 }
if JoyY > %JoyZoneDn%
 {
 SendPlay {Down}
 } 
return

т.е. джойстику нужна мёртвая зона около "нуля" иначе он будет работать всегда, т.к. оси сделаны на резисторах, если у тебя конечно не Saitek последних моделей начиная с X52/X52 Pro.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

10

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Я извиняюсь если буду говорить глупости, просто впервые поставил AutoHotkey несколько дней назад и знаю лишь простейшие вещи. У меня руль с педалями. От него интересуют только педали. JoystickTest.ahk показывает что педали это ось Y. Если обе педали отпущены, то Y = 050. Если нажимать левую, то этот показатель плавно увеличивается от 050 до 100, а если правую, то падает до Y000. Задачей является повесить клавишу "-" на нажатие левой педали, то есть возрастание Y от 050 до 100. Например от Y080 до Y100 — клавиша нажата. Всё что меньше Y080 —  клавиша отпущена. При нажатии этой клавиши клавиатура и мышь должны работать в самом обычном режиме, как если бы я нажимал "-" на клавиатуре. То есть без каких либо глюков с модификаторами и общих задержек клавиш. Вроде кое-как настроил эту конструкцию под нажатие "-", но опять те же самые глюки с курсором, задержками и т.п. Отчаяние.

11 (изменено: Indomito, 2012-03-22 16:35:17)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

if y>81
 Send, {- Down}
if y<79
 Send, {- Up}
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

12

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Это вписать в конец той большой конструкции?

13 (изменено: Indomito, 2012-03-22 18:30:31)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Да, сейчас её подредактирую...

Приблизительно так:

#SingleInstance
#Persistent
 
JoystickNumber := 1
JoyZone := 20

; "+1" добавлен из-за сравнения "больше", если поставить "больше или равно" то "+1" не нужен
JoyZoneY := 100 - JoyZone + 1
 
SetTimer, Joystick, 10

 
Joystick:
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX ; не обязательно, если нет обработки X-оси.
GetKeyState, JoyY, %JoystickNumber%JoyY

if JoyY > %JoyZoneY%
 SendPlay {- Down}
else
 SendPlay {- Up}

return
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

14

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Indomito, благодарю!

Хм, правда здесь происходит та же самая аномалия:

Но начались странные аномалии, сводящие на нет любые преимущества. Все клавиши начали срабатывать с задержкой, модификаторы работают, но странно. Например Alt+Shift перестал переключать раскладку клавиатуры, а при попытке свернуть браузер левой кнопкой мыши курсор виснет на одном месте и отказывается двигаться, оживая только после Alt+Tab, который работает. Тем не менее в игре Alt+Shift работает (хотя все клавиши, как я уже говорил, работают с задержкой). Мистика. %)

Курсор также намертво зависает при попытке закрыть окно нажатием на крестик. Оживает также по Alt+Tab. На Alt стоит автоповтор с огромной скоростью. То есть она не зажимается, но при этом Alt+Tab работает.  Хм. И это не во всех окнах происходит. Что это вообще может быть?

15 (изменено: Indomito, 2012-03-22 19:02:18)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Ну надо проверять когда срабатывает секция (используй отладочные точки)

Joystick:

......

return

Буду делать аналогичное - скажу, правда я не на ось буду вешать, а на кнопки джойстика, но думаю принцип будет тот же.

P.S. У меня "курсор замирал намертво" при большой скорости повтора - попробуй покапать в этом направлении и также если клавиша нажата, то не надо её повторно нажимать, ну как и отжимать.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

16

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Скорость повтора была громадная при простейшем бинде кнопки на ось.
If (JY > 050)
Send {-}

При этом варианте всё великолепно работало за исключением одного неприятного момента: индикаторы, которые забиндены в приложении на "-" мигали с такой скоростью, что становились просто невидимыми.

«Ну надо проверять когда срабатывает секция (используй отладочные точки)» — Из этого предложения ничего не понял, поэтому постараюсь дождаться этого: «Буду делать аналогичное - скажу». В любом случае спасибо.

17

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Попробуй так, я добавил флаг - переменная FlagY

#SingleInstance
#Persistent
 
JoystickNumber := 1
JoyZone := 20

; "+1" добавлен из-за сравнения "больше", если поставить "больше или равно" то "+1" не нужен
JoyZoneY := 100 - JoyZone + 1
FlagY := false

SetTimer, Joystick, 10

 
Joystick:
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX ; не обязательно, если нет обработки X-оси.
GetKeyState, JoyY, %JoystickNumber%JoyY

if JoyY > %JoyZoneY% and FlagY
 {
 SendPlay {- Down}
 FlagY := false 
 }

if JoyY < %JoyZoneY% and !FlagY
 {
 SendPlay {- Up}
 FlagY := true
 }
return

Вроде правильно - не проверял, но думаю общая идея ясна

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

18

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

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

19

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

Тогда зайди на форум "Сухого" там ребята много что делают в области переделки джойстиков (на уровне железа)

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download

20 (изменено: Indomito, 2012-03-25 12:55:13)

Re: AHK: Бинд клавиши на JoyY — отказ клавиш-модификаторов

MAGISTR как просил сделал для себя, но ты меня с подвигнул... я бы долго собирался.

1. Убрано то что тебе не нужно.
2. Обработка только одной оси и одного направления джойстика, остальное пишется по аналогии.

#SingleInstance
#Persistent

JoystickNumber := 1

;---Граничные условия
JoyZoneUp := 25
JoyZoneDn := 100 - JoyZoneUp

;---Флаги Left Right Up Down стрелок 
; Истина - кнопка не нажата
flagL := true
flagR := true
flagU := true 
flagD := true

;********Отладочные переменные
countUP := 0
countDN := 0
;********


SetTimer, LeftJoystick, 10

return


;==========Секция таймера=================
LeftJoystick:
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX

;--------ОТЛАДКА---------
; Alert Exit! =) 
GetKeyState, state, %JoystickNumber%Joy1  ; Первая кнопка джойстика.
if (state = "D")
 ExitApp
;------------------------- 

;*********Стрелка LEFT
if (JoyX < JoyZoneUp and  flagL) 
 {
  countDN++  ;<----Для отладки (убрать)
  ToolTip  Нажали = %countDN% ;<----Для отладки (убрать)
  ;Send, {Left Down} после проверки раз комментировать
  flagL := false
 }
else if (JoyX > JoyZoneUp and !flagL) 
 {
  countUP++ ;<----Для отладки (убрать)
  ToolTip  Отжали = %countUP%  ;<----Для отладки (убрать)
  ;Send, {Left Up} после проверки раз комментировать
  flagL := true
 }
;*********
return
;================================

Функция автоповтора не реализована, но если она требуется, то могу и её сделать в режиме On/Off по произвольной клавише.

Удачного полёта

P.S. Секция аварийного выхода

;--------ОТЛАДКА---------
; Alert Exit! =) 
GetKeyState, state, %JoystickNumber%Joy1  ; Первая кнопка джойстика.
if (state = "D")
 ExitApp
;-------------------------

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

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AutoHotkey v1.1.32.00 - November 24, 2019
Click to Download