Comment simplifier ce script AHK? GetKeyState ou KeyWait?


0

J'ai un script qui contient trois variantes comme celles-ci pour plus de 50 clés. Je me demande, comment pourrais-je le réduire?

; 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

Cela fonctionne comme je le veux. Ce qui est important, c’est l’option choisie (1 ou 2) et les deux Sleepvaleurs différentes pour "Option 1". J'aimerais que ça fonctionne comme ça.

J'ai essayé d'utiliser GetKeyState(même si la fonction est recommandée, pas celle-ci) sans succès. Deux problèmes:

  1. Je ne peux pas appuyer sur les touches Ctrl ou Alt avant la touche "a", contrairement à la touche d'origine. Je devais donc mettre un Sleepau début et appuyer sur les modificateurs dans la première seconde.
  2. Cela ne fonctionnait toujours pas, car si je ne remplis pas ces variables en appuyant sur les touches réelles (Ctrl et / ou Alt), un message d'erreur apparaît.

Je pouvais trouver une solution de contournement pour les deux, mais je sentais que ça ne marcherait pas après tout. Voici le code:

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

Après cet échec, j'ai pensé à utiliser plusieurs KeyWaitcommandes, mais je n'en suis plus sûr.

TL; DR. Si un utilisateur expérimenté d'AHK pouvait aider avec une alternative plus courte et plus efficace ou une solution pour la GetKeyStatevariante (ou la déboguer), ce serait très apprécié!


Edit : en utilisant le caractère générique '*' et le GetKeyState en tant que fonction, le code fonctionne mieux que l'original et contient moins de répétitions, ce qui me permet de modifier plus facilement ultérieurement, si nécessaire.

*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

Réponses:


1

Je ne sais pas quel problème vous essayez réellement de résoudre. Vous essayez simplement de combiner le premier script en un code plus efficace? Ou bien le premier script ne fonctionne-t-il pas comme vous le souhaitez?

Vous pouvez utiliser un modificateur étoile ('*') devant la touche de raccourci pour lui permettre de se déclencher avec les modificateurs déjà appuyés (vous devrez ensuite les gérer correctement s'ils ne sont pas présents, ce que votre code d'exemple fait partiellement). . Je crois que cela concerne le premier élément que vous avez cité comme un problème.

c'est à dire,

*a::

Cela déclenchera sur a, #a, +a, ^a, !a, ^!a, etc.

Vous pouvez également appeler GetKeyState()sans affecter de variables d'état intermédiaires et vérifier si les modificateurs sont activés.

If GetKeyState("Control", "P") && GetKeyState("Alt", "P") {
}

Le premier code que j'ai collé fonctionne parfaitement. Cela ne me pose pas de problème, mais plutôt une préférence, de fusionner les trois raccourcis clavier en un. A propos de votre réponse, le joker pourrait résoudre mes problèmes, je ne le savais pas. Et avec la partie de fusion, je pense maintenant aux sous-routines, mais je vais d'abord essayer à nouveau la méthode GetKeyState, en utilisant la fonction cette fois-ci.
déviance
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.