Сценарий AHK, разработанный для переключения на основе состояния CapsLock, всегда включает «выкл», и я не могу изменить его на «вкл» - PullRequest
0 голосов
/ 21 мая 2019

(Примечание: очень плохо знаком со сценариями, заимствовал некоторые фразы из других сценариев, которые я в сети.) У меня есть Carpal Tunnel и я играю в видеоигру, в которой нет опций привязки клавиш, для которых не установлены клавиши F1-F0, поэтому Я хочу перепривязать клавиши F1-F4 к ZV, но только при включенной функции capslock, чтобы предотвратить невозможность набирать текст в окнах чата и других программах без закрытия скрипта. Тем не менее, сценарий повторно связывает основные клавиши с клавишами F, ТОЛЬКО при отключении capslock, вместо того, чтобы позволить мне изменить его на ON. Не уверен почему.

Я пытался «исправить» его, привязав его к Numlock, но когда я перешел в CapsLock, изменив значение «OFF» на «ON», сценарий не удерживал только переподключение клавиш, пока CapsLock был выключен. Не уверен почему.

$Z::
  GetKeyState, state, NumLock, T
  if state = D ; NumLock is toggled ON
    send, {z}
  else
    send, {F1}
  Return 


$X::
  GetKeyState, state, NumLock, T
  if state = D ; NumLock is toggled ON
    send, {x}
  else
    send, {F2}
  Return 

etc...
etc...

Я ожидал, что изменение значения «ВЫКЛ» на «ВКЛ» приведет к повторному связыванию клавиш только при включенном состоянии CapsLock.

1 Ответ

1 голос
/ 21 мая 2019

Вы проверили, перезапускали ли вы скрипт после внесения изменений?Это очень распространенная ошибка не только среди начинающих.В соответствии с вашим примером ваши ключи Z .. V должны вести себя как F1 .. F4 только при выключенном NumLock.

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


Вы можете легко выполнить условное связывание с помощью директивы #if, которая делает последующие горячие клавиши и горячую строку эффективными только при выполнении условия.

Чтобы проверить состояние CapsLock или NumLockклавишами вы также можете использовать встроенную функцию GetKeyState, которая для клавиш переключения, таких как CapsLock или NumLock, в режиме "T" возвращает значение True или False в зависимости от переключателясостояние клавиши.

Кроме того, если вы хотите переназначить клавиши, вы можете просто написать имя целевой клавиши справа от горячей клавиши, которая будет полностью связывать клавиши, как в событиях Down, так и Up.Однако, чтобы это работало, вы должны указать свои триггерные клавиши в нижнем регистре, так как указание верхнего регистра будет запускать переназначение только при нажатии клавиш с клавишей Shift (CapsLock не будет иметь никакого эффекта), и это не ваше желаемое поведение,[ Подробнее о переназначении клавиш ]

Вот пример того, что вы можете сделать:

#If GetKeyState("CapsLock", "T")
z::F1
x::F2
c::F3
v::F4

Обратите внимание, что, поскольку переназначение клавиш всегда использует хук клавиатуры (потому чтоон также должен регистрировать события Up), нет необходимости использовать префикс $ в ваших горячих клавишах.


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

Однако, если в игре есть чаты, вы можете объединить оба условияв одном #If, используя встроенную функцию WinActive следующим образом:

#If GetKeyState("CapsLock", "T") and WinActive("My Game Title")
z::F1
; ...

Вы можете проверить, как сузить поиск окна по его заголовку на документация для параметра WinTitle .


Если вы хотите еще больше улучшить свой сценарий, вы можете узнать, есть ли какие-либо обнаруживаемые изменения в окне игры, когда чат активен,например, если переменного токаДля этого существует определенный контроль (вы можете проверить, как если бы это было другое окно, используя функцию WinExist для проверки определенного класса окна.

Чтобы искать такие изменения, вы можете использоватьСценарий выглядит следующим образом (из документации MouseGetPos ):

#Persistent
SetTimer, WatchCursor, 100
return

WatchCursor:
MouseGetPos, , , id, control
WinGetTitle, title, ahk_id %id%
WinGetClass, class, ahk_id %id%
ToolTip, ahk_id %id%`nahk_class %class%`n%title%`nControl: %control%
return

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

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


Еще один хитрый способ проверить, активен ли чат, - это найти изображение на экране или цвет пикселя, используя ImageSearch или намного проще PixelGetColor, но выможет сделать это, только если интерфейс вашей игры не очень сложный / анимированный.

...