autohotkey desativa uma chave globalmente, mas ativa em uma janela

2

Eu quero desabilitar uma chave globalmente, digamos, espaço ,
mas habilite em uma janela específica, por exemplo, Notepad .

Depois coloco as linhas abaixo em key.ahk e carrego

space::return

#IfWinActive ahk_class Notepad
    space::send {space}
#IfWinActive

Mas abaixo do erro ocorre quando eu digito espaço em Notepad :

71 hotkeys have been received in last 1109 ms.
Do you want to continue?
(see #MaxHotkeysPerInterval in the help file)

parece resultar em recursão infinita.

Se eu mudar

    space::send {space}

para

    space::space

Então nada acontece quando espaço é digitado em Notepad .

A questão é, como eu posso desabilitar espaço globalmente, mas habilitá-lo em Notepad ?

== EDIT ==

Eu faço quero desabilitar a chave globalmente , ou mais útil, remapear para outra seqüência de teclas.

    
por qeatzy 26.10.2017 / 03:42

2 respostas

2

Você não precisa se preocupar com o que fazer quando o Notepad não estiver ativo. Se você tiver apenas uma parte que lida com o que acontece quando o Bloco de Notas está ativo, os horários não ativos não farão nada por padrão.

Este código irá desativar o Espaço em tudo, exceto no Bloco de Notas, conforme descrito na sua pergunta:

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
        return
    }

A linha send {Asc 32} envia o código ASCII para um espaço, o que impede que o script capture seu próprio espaço enviado e inicie novamente.

    
por 26.10.2017 / 04:31
1

O código da resposta aceita (como está listado no momento em que este texto foi escrito) tem um retorno dentro da declaração if ...

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
        return
    }

A melhor prática seria colocar o return fora da instrução if (colocar um retorno no final de qualquer código de tecla de atalho), para que ele sempre retorne, portanto, se esse bloco de código for usado em outro arquivo e / ou com outro código, a execução não continuará além da rotina que manipula a tecla de atalho space:: .

Atualmente, qualquer código subseqüente ainda será executado se o espaço for pressionado em uma janela que não seja do bloco de notas.

A ligeira modificação para corrigir isso seria a seguinte:

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
    }
return

Se a instrução return estiver fora da instrução if , você também poderá se livrar dos colchetes da única linha send após a instrução if:

space::
    if WinActive("ahk_class Notepad") 
        send {Asc 32}
return

Uma pequena variação disso seria simplesmente retornar se o Notepad não estiver ativo. Isso pode ser útil em casos em que há um monte de código a seguir (em vez de apenas uma única instrução send ), basicamente porque pode ser mais fácil de ler e entender ...

space::
    if !WinActive("ahk_class Notepad") 
        return   ; execution will end here unless Notepad is active

    send {Asc 32}

    ...

    ...

    ; lots of other code can be added here 
    ; without encompassing it in an if {} block

    ...

    ...

return   ; make sure nothing following this will execute
    
por 28.10.2017 / 07:49