AutoHotkey Executa o script enquanto mantém pressionada a tecla

0

Preciso de ajuda com um script, quero que ele seja executado apenas enquanto estou segurando uma chave. Aqui está o roteiro:

;If you use this, you have to use absolute screen coordinates.
CoordMode, Mouse, Screen

;Suppose a 100x100 px bounding box for your game inventory.
;Eg., from (500, 500) to (600, 600)
w::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent
    yMoved := yCurrent - 35

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
MouseGetPos, CoordXRec, CoordYRec
        MouseMove, xMoved, yMoved


if(yMoved < 503 && yMoved > 350 && yMoved > 360){
MouseMove 1846, 166
}
if(yMoved < 145){
MouseMove, %CoordXRec%, %CoordYRec%, 0
}
if(yMoved < 718 && yMoved < 720 && yMoved > 680){
MouseMove 1771, 671
}
return  
}
s::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent
    yMoved := yCurrent +35

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.

        MouseMove, xMoved, yMoved

if(yMoved > 285 && yMoved < 360){
MouseMove 1773, 526
}
if(yMoved > 697 && yMoved < 715){
MouseMove 1772, 736
}
return
}
a::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent -40
    yMoved := yCurrent 

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
    if (xMoved > 1740) {
        MouseMove, xMoved, yMoved
    }
return  
}
d::
{
    ;Get current Mouse coords
    MouseGetPos, xCurrent ,yCurrent

    ;Calculate future Mouse coords
    xMoved := xCurrent +40
    yMoved := yCurrent 

    ;Check if the future mouse postion will be
    ;below the top border of your bounding box, 
    ;aka still inside it, after it has moved.
    ;If so, proceed and move the mouse,
    ;otherwise do nothing.
    if (xMoved < 1917) {
        MouseMove, xMoved, yMoved
    }
return  
}

Basicamente, você controla o mouse com o WASD e também tem outras funcionalidades, mas eu quero fazer com que você tenha que segurar uma tecla para poder se mover. Obrigado!

    
por kinkingsu 13.03.2017 / 14:50

1 resposta

0

Se você está se referindo a manter pressionada a tecla para essa ação e ter algum atraso antes que a ação seja ativada (versus manter pressionada alguma outra tecla, como um modificador), você poderia fazer algo com GetKeyState como já mencionado.

O seguinte conjunto de código pode ser inserido ou chamado como uma função de cada definição de tecla de atalho. Você pode alterar as configurações de atraso conforme necessário para adequar-se ao que está tentando fazer (ou pode não fazer exatamente o que deseja fazer e pode ser complicado se não for o que você estava pensando, mas a postagem original era bem vago).

Insira este código no início de cada definição de tecla de acesso e ele exigirá que você mantenha essa tecla de acesso pressionada por um determinado período de tempo antes de ser ativada, caso contrário, o pressionamento de tecla será enviado regularmente. Você também precisará adicionar um $ na frente da definição de tecla de atalho para que a instrução Send não acione novamente a definição de tecla de acesso duas vezes seguidas e cause uma execução imediata (já que essa função precursora enviará a mesma chave como a tecla de atalho, se o usuário pressiona brevemente a tecla e não a mantém pressionada).

Como as variáveis de tecla de atalho são genéricas, você também pode colocar isso em uma chamada de função separada, para não precisar repetir o código e, em seguida, apenas chamar a função para cada tecla de atalho. Talvez isso lhe dê algumas ideias, mesmo que não seja exatamente o que você quer.

$a::
{
    ; make these global or static as desired so they don't have to be reassigned for each function call
    holdDelay:=300          ; time to wait before activation (or conversely, must release before this time to send a keystroke)
    repeatDelay:=700        ; max time to detect a repeat event--must be bigger than holdDelay or won't work

    ; if we just triggered this key last time and it's been less than the repeat delay,
    ; bypass the hold-down check and skip directly to desired function for moving the mouse
    If Not ((A_ThisHotkey=A_PriorHotkey) && (A_TimeSincePriorHotkey<repeatDelay)) {

        trimmedHotkey:=Trim(A_ThisHotkey, "$")  ; get rid of preceding $ so we can detect and send just the keystroke

        startTick:=A_TickCount                              ; init timer
        While GetKeyState(trimmedHotkey, "P")               ; Loop while key is pressed down, otherwise exit    
        && !(heldDown:=(A_TickCount-startTick)>holdDelay)   ; check for helddown/timeout (user held the key down)
            Sleep 10                                        ; wait a few ms...

        If !heldDown {                  ; if user didn't hold the key down, send it back as a keystroke

            SendInput % trimmedHotkey
            Return 
        }

    }

    ; Rest of the code goes here
    
por 22.03.2017 / 07:02