Есть ли способ сообщить действию autohotkey (подпрограмма), чтобы отпустить Alt несмотря на то, что его триггер Alt + X ?? вот мой код ...

!x::
sleep 100
it does some clicks and drags here (work fine)
return

но, несмотря на sleep 100 в моем коде, иногда, когда я нажимаю Alt + X если я вручную нажимаю alt, скрипт выполняет Alt Click , а не только Click который делает совершенно другую вещь.

Я знаю, что мог бы увеличить задержку (сон 100) или настроить AHK на ожидание, пока не будет выпущена клавиша alt, но ничего из этого не поможет, потому что этот скрипт будет запускаться несколько раз непрерывно, поэтому я предпочитаю удерживать Alt и нажать вниз / вверх x несколько раз, чтобы запустить его несколько раз непрерывно.

Поэтому мне нужен способ временно заблокировать клавиатуру или настроить скрипт на отпускание клавиши alt, чтобы autohotkey не распознавал, что мой палец все еще нажимает Alt при выполнении сценария несколько раз.

Мне нужно что-то похожее на это ...

BlockInput, MouseMove
BlockInput, On

Кстати, я пробовал оба, они не работают.

EDIT >>>>>

Это моя функция, чтобы нажать и перетащить ...

AR4clickDnABmoveClickUpCDfn(ParamA, ParamB, ParamC, ParamD)
{
    If AR4togWorkbMode
    {
        AR4workbModeFn()    ;   Since this fn is used to click n drag panels, after disabling AR4workbMode I won't enable it back, cuz is supposed I need to see the Panel I'm draging afterward
        AR4togWorkbMode := !AR4togWorkbMode ;   So AR4retWorkbMode doesn't need to be set, but AR4togWorkbMode does
        Sleep 200
    }

        MouseGetPos X, Y
        BlockInput, On
        ;   BlockInput, MouseMove
        Sleep 50

        MouseMove, ParamA, ParamB
        Click down
        Sleep 50

        Loop 10
        {
            MouseMove, -1, 1, 100, R
        }

        Sleep 40
        MouseMove, ParamC, ParamD, 100
        Click Up

        BlockInput, Off
        ;   BlockInput, MouseMoveOff
        MouseMove %X%, %Y%
}

Тогда я в другой подпрограмме !x запустить подпрограмму, которая будет щелкать панель и вызывать функцию click and drag , чтобы перетащить панель, вот и все.

#If WinActive("ahk_class ArtRage 3") or WinActive("ahk_class ToolWindow")

<!x::
;   Lalt & x::
If !AR4togToolSetsNear  ;   will run the first time the hotkey is pressed cuz the toggle var is not set yet
{
    Sleep 220
    AR4clickDnABmoveClickUpCDfn(AR4toolSetsX0 + AR4toolSetsSetGapXX, AR4toolSetsY0 + 10, AR4toolSetsNearX, AR4toolSetsNearY)
    AR4togToolSetsNear := !AR4togToolSetsNear
    Sleep 20
    WinActivate, ahk_class ArtRage 3
}
Else
{
    Sleep 220
    AR4clickDnABmoveClickUpCDfn(AR4toolSetsNearX, AR4toolSetsNearY, AR4toolSetsX0 + AR4toolSetsFarDifXX, AR4toolSetsY0 + AR4toolSetsFarDifYY)
    AR4togToolSetsNear := !AR4togToolSetsNear
    Sleep 20
    WinActivate, ahk_class ArtRage 3
}
Return

#If

НО, поскольку этот триггер подпрограммы содержит Lalt если я нажимаю и удерживаю Alt , нажимая и отпуская X несколько раз, чтобы вызвать подпрограмму несколько раз. Затем скрипт AHK будет отправлять Alt Click and Drag и не только Click and Drag первый будет фактически вращать панель, в то время как последний будет ее перемещать, я хочу переместить его, но не повернуть, но с другой стороны мне нужно нажать и удерживайте ALT для запуска подпрограммы несколько раз, как я могу это сделать ??

Как я могу заставить AHK видеть Alt-клавиатуру как отпущенную, когда я нажимаю вручную?

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

2 ответа2

1
; Trigger an action (subroutine) by releasing the left Alt key, 
; without losing its native function as modifier key:

LAlt up:: 
if (A_PriorKey = "LAlt")
    Send a               ; do sth
return


; Trigger another action by releasing the left Alt key 
; in a key combination:

LAlt & x:: Send b       ; do sth else
; or:
; <!x:: Send b          ; <! means LAlt 
0

вот пример того, как использовать blockinput

https://autohotkey.com/docs/commands/BlockInput.htm

^!p::
KeyWait Control  ; Wait for the key to be released.  Use one KeyWait for each of the hotkey's modifiers.
KeyWait Alt
BlockInput On
; ... send keystrokes and mouse clicks ...
BlockInput Off
return

Я просто должен был добавить, KeyWait Alt

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