1

У меня есть два сценария в AHK, оба запускаются "последовательностями клавиш" (b нажата дважды) и (1 нажата дважды), вот код

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

SetTitleMatchMode RegEx ; matchs apps windows names using RegEx



;   Delay A between key sequence triggers
ARkeySeqDelayA := 250

;   if Presets Panel is in 100%
;   Y axis top in tool presets is 122 pixels
;   Y axis gap between tool presets is 29 pixels
ARtoolPresetTopY := 125
ARtoolPresetGapY := 29
return





#If WinActive("ahk_class ArtRage 3")



b::
if Keyb_presses > 0 ; SetTimer already started, so we log the keypress instead.
{
    Keyb_presses += 1
    return
}
; Otherwise, this is the first press of a new series. Set count to 1 and start
; the timer:
Keyb_presses = 1
SetTimer, Keyb, -250 ; Wait for more presses within a 250 millisecond window.
return

Keyb:
if Keyb_presses = 1 ; The key was pressed once.
{
    BlockInput, MouseMove
    Send {b}
    sleep 80
    MouseClick, left, 195, 55
    Sleep 200
    MouseClick, left, 200, 85
    BlockInput, MouseMoveOff
}
else if Keyb_presses = 2 ; The key was pressed twice.
{
    BlockInput, MouseMove
    Send {b}
    sleep 80
    MouseClick, left, 195, 55
    Sleep 200
    MouseClick, left, 200, 110
    BlockInput, MouseMoveOff
}
; Regardless of which action above was triggered, reset the count to
; prepare for the next series of presses:
Keyb_presses = 0
return





1::
if Key1_presses > 0 ; SetTimer already started, so we log the keypress instead.
{
    Key1_presses += 1
    return
}
; Otherwise, this is the first press of a new series. Set count to 1 and start
; the timer:
Key1_presses = 1
SetTimer, Key1, -250 ; Wait for more presses within a 250 millisecond window.
return

Key1:
if Key1_presses = 1 ; The key was pressed once.
{
    BlockInput, MouseMove
    MouseClick, left, 13, ARtoolPresetTopY
    BlockInput, MouseMoveOff
}
else if Key1_presses = 2 ; The key was pressed twice.
{
    BlockInput, MouseMove
    MouseClick, left, 13, ARtoolPresetTopY + (ARtoolPresetGapY * 8)
    BlockInput, MouseMoveOff
}
; Regardless of which action above was triggered, reset the count to
; prepare for the next series of presses:
Key1_presses = 0
return

но каким-то образом, когда я запускаю сценарий "1", а затем через несколько секунд я хочу использовать сценарий "11", он не будет работать, если я сам нигде не щелкал ранее (вручную), кажется, что предыдущий сценарий AHK как-то все еще работает и нуждается во мне, чтобы закончить это, щелкнув себя в любом месте.

Также, когда я запускаю сценарий "bb", а затем через 1 секунду я хочу использовать сценарий "1", он не будет работать, опять же кажется, что AHK все еще выполняет сценарий previuos или что-то в этом роде, и мне нужно сделать Кликни сам, и тогда только тогда будет работать скрипт "1". Так что я не могу запускать сценарии "bb" и "1" один за другим (это то, что я всегда делаю, очень необходимо) без необходимости делать некоторые щелчки мышью между ними, как я могу избежать этого ??

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

Run C:\Users\myname\Desktop\AR4 bb.exe    ; the same script done in a macro recorder
click up left

и я заметил, что проблема не устранена, так же как и способ, которым скрипт выполняет различие между одинарными и двойными нажатиями клавиш, которые мешают выполнению сценария два раза подряд. Если я нажму "b", подожду одну секунду, но не буду сам щелкать мышью, и нажму "bb" (b два раза), она выполнит "b", но если я сделаю несколько щелчков мышью с помощью myselft, то выполнит "bb". почему это происходит?

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

Спасибо, Дополнительно.

1 ответ1

1

Для контроля того, щелкает ли мышь в правильном положении в правом окне, вы можете использовать это:

F1::
ARtoolPresetTopY := 125
ARtoolPresetGapY := 29

Ypos := ARtoolPresetTopY + (ARtoolPresetGapY * 8)
MsgBox, %Ypos%  ; Press Enter for closing this MsgBox.

; Click, 13, %Ypos%
; or
ControlClick, x13 y%Ypos%, ahk_class ArtRage 3

MouseMove, 13, %Ypos%, 0 ; this line is only needed for getting the mouse position and the name of the control you want click:
MouseGetPos, MouseX, MouseY, WindowUnderMouse, ControlUnderMouse
WinGetTitle, title, ahk_id %WindowUnderMouse%
WinGetClass, class, ahk_id %WindowUnderMouse%

MsgBox, MouseX = %MouseX%`nMouseY = %MouseY%`n`nWinTitle = %title%`nWinClass = ahk_class %class%`n`nControlUnderMouse = %ControlUnderMouse%
return
  • Вместо Click вы можете использовать ControlClick (тогда вам не нужен BlockInput).

  • Попробуйте также заменить "b::" и "1::" на " $ b:: " и " $ 1:: ". (Крючки клавиатуры всегда имеют приоритет).

  • Смотрите также: Отладка скрипта.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .