Como simplificar este script AHK? GetKeyState ou KeyWait?

0

Eu tenho um script que contém três variantes como estas para mais de 50 chaves. Eu me pergunto, como eu poderia diminuir isso?

; Press "a" = Option 1 (with 500 ms sleep)
; Press "Ctrl + a" = Option 2 (with 500 ms sleep)
; Press "Ctrl + Alt + a" = Option 1 (with 1000 ms sleep)

a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 500
    Send, {Enter}
Return

^a::
    Send, {Enter}
        Sleep, 100
    Send, 2
        Sleep, 500
    Send, {Enter}
Return

^!a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 1000
    Send, {Enter}
Return

Isso funciona como eu quero que funcione. O que é importante é a opção escolhida (1 ou 2) e os dois valores Sleep diferentes para "Opção 1". Eu gostaria que funcionasse assim.

Eu tentei usar GetKeyState (mesmo se a função for recomendada, não isso) sem sucesso. Dois problemas:

  1. Eu não posso pressionar Ctrl ou Alt antes da tecla "a", ao contrário da original. Então eu tive que colocar um Sleep no começo e pressionar os modificadores no primeiro segundo.
  2. Ainda assim não funcionou, porque se eu não preencher essas variáveis pressionando as teclas atuais (Ctrl e / ou Alt), isso fornecerá uma mensagem de erro.

Eu poderia encontrar uma solução alternativa para ambos, mas senti que simplesmente não funcionaria, afinal. Aqui está o código:

a::
    Sleep, 1000
    GetKeyState, AltState, Alt
    GetKeyState, CtrlState, Ctrl
    Send, {Enter}
    if (CtrlState = D) {
        Send, Option 2
            Sleep, 500
    }
    else {
        Send, Option 1
        if (CtrlState = D and AltState = D) {
            Sleep, 1000
        }
        else {
            Sleep, 500
        }
    }
    Send, {Enter}
Return

Depois disso, pensei em usar vários comandos KeyWait , mas não tenho mais certeza.

TL; DR. Se um usuário experiente do AHK puder ajudar com uma alternativa mais curta e eficiente ou com uma solução para a variante GetKeyState (ou depurá-la), isso seria muito apreciado!


Editar : Usando o curinga '*' e o GetKeyState como uma função, o código funciona melhor do que o original e contém menos repetições, facilitando a modificação posterior , se necessário.

*a::
    Send, {Enter}
    Sleep, 100
    if GetKeyState("Control", "P") and not GetKeyState("Alt", "P") {
        Send, 2
        }
    else {
        Send, 1
        }
    if GetKeyState("Alt", "P") and GetKeyState("Control", "P") {
        Sleep, 1000
        }
    else {
        Sleep, 500
        }
    Send, {Enter}
Return
    
por deviance 16.08.2018 / 06:53

1 resposta

1

Não estou claro em qual problema você está realmente tentando resolver. Você está apenas tentando combinar o primeiro script em um código mais eficiente? Ou o primeiro script não funciona de alguma forma que você gostaria?

Você pode usar um modificador de estrela ('*') na frente da tecla de atalho para permitir que ele seja acionado com modificadores já pressionados (e então você terá que lidar com eles apropriadamente se eles não estiverem lá, o que seu código de exemplo parcialmente faz). Eu acredito que isso resolve o primeiro item que você listou como um problema.

ou seja,

*a::

Isso acionará a , #a , +a , ^a , !a , ^!a , etc.

Você também pode chamar GetKeyState() sem atribuir variáveis de estado intermediárias e verificar se os modificadores estão sendo pressionados.

If GetKeyState("Control", "P") && GetKeyState("Alt", "P") {
}
    
por 20.08.2018 / 04:20