Autohotkey: Use Espaço + Alt + q para acionar ações

3

Eu tenho algumas ações definidas em um script Autohotkey e quero executá-lo | sempre que eu pressionar ESPAÇO + Alt + Q .

Como posso fazer isso?

Eu li que space tem alguns problemas, porque ele já é usado pelo AHK para confirmar as abreviações ou algo assim, mas eu realmente não uso abreviações.

~Space & j::
   If GetKeyState("Alt") = 0
           Send {Left}
   Else
           Send +{Left}
Return

Quais sugestões você tem?

agora estou tentando isso que veio do fórum do AHK, até agora, ele permite que eu execute o script continuamente sem ter que liberar a barra de espaço

; THIS IS THE FIRST PART OF MY SCRIPT, ITS FOR THE e, +e, d, +d HOTKEYS...
ARprecColPickerFn(a, b, c)
{
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 2)
return

+e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
return

d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
return

+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return


; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::
    KeyWait,Space,T0.2
    If (ErrorLevel)
    {
        HotstringsEnabled:=true
        KeyWait,Space
        HotstringsEnabled:=false
    }
        else
        Send {Space}    
Return
#If HotstringsEnabled
#Hotstring *

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

!e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
return

d:
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

!d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -2)
#If

Até agora, o script funciona bem, mas tenho um problema. a primeira parte do script, aquela que usa "d" como tecla de atalho, é acionada sempre que eu pressionar "espaço + d", como posso fazer as duas ações coexistirem? (aquele que é acionado por "d" e o outro que é acionado por "space & d" Por favor, qualquer superusuário do AHK que possa verificá-lo, obrigado, avançado.

Btw, o que significa ...

#Hotstring *

EDITADO > > > >

Em um script Autohotkey, eu gostaria de Space Alt E para ADD FIVE e Space Alt D para SUBTRACT FIVE e Space E para ADD TEN e Space D para SUBTRACT TEN.

Quero adicionar ou subtrair consecutiva e rapidamente, por isso, quero manter pressionado Space Alt e, em seguida, ter eventos distintos ao pressionar E ou D . por exemplo. SpaceHoldDown AltHoldDown Edown Eup Edown Eup Edown Eup adicionaria CINCO 3 vezes.

Também, às vezes, primeiro pressiono Space e, em seguida, Alt (para mantê-los pressionados antes de pressionar E ou D para ADICIONAR ou SUBTRAIR) e outras vezes eu pressiono primeiro Alt e Space , mas em ambos os casos eu gostaria de obter o mesmo resultado ao pressionar E ou D depois. Isso é algo que meu roteiro atual não pode fazer, ou seja, eu sempre tenho que tomar cuidado para pressionar primeiro Space e depois Alt antes de pressionar E ou D para que o script funcione, porque se eu pressionar primeiro Alt e depois Space não funciona. Gostaria que o script funcionasse independentemente da ordem em que Space e Alt Key foram pressionados.

Finalmente eu preciso da Space Key para manter sua função nativa (não para ser bloqueada) pq ela é usada para navegar na aplicação.

Atualmente, o script está funcionando, permitindo que eu segure Space Alt e E ou D consecutivamente para ADICIONAR ou SUBTRAIR várias vezes, mas tenho os problemas que tenho que pressionar primeiro Space then Alt caso contrário não funcionará, também toda essa paz de script deve ser colocada no final do meu script AHK porque senão ele irá interferir com outras sub-rotinas.

Última edição, o código está tentando baseado na resposta JJHONSTON2 ...

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")

    #If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))
        q::
            msgbox you typed Alt Space Q
    #If
#If    <----- do I need to put a second #If (turn off context sensitivity)?

mas não funciona.

Após o teste, percebi que tenho que usar #If e não If , pois o último só acionará a sub-rotina se eu pressionar Alt e Space APÓS ter pressionado Q.

Mas o uso de #If não permite testar duas chaves usando o & & operando. por favor alguém saberia como usar o #If GetKeyState com 2 chaves Space e Alt

Por favor, note que eu preciso ser capaz de segurar space e alt e pressionar e soltar Q várias vezes para ADICIONAR 10 consecutivamente, isso é muito importante, é por isso que uma solução alternativa como essa abaixo não é útil pq força-me a liberar alt ou space entre sub-rotinas (executá-lo várias vezes)

#If GetKeyState("Space", "P")
!q::    ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

#If GetKeyState("Alt", "P")
Space & q:: ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

obrigado adiantado.

    
por litu16 24.11.2016 / 22:58

6 respostas

1

Estou postando mais, porque você continua tentando sugestões e combinações diferentes e não está apenas pedindo a alguém para escrever seu roteiro.

Vou copiar / colar / modificar vários exemplos de definição de chave, na esperança de lhe dar uma ideia de formas diferentes como isto pode ser feito (de maneiras que podem ou não já ter sido mencionadas), e espero dar-lhe uma melhor compreensão das várias combinações lógicas que podem ser usadas em vez de apenas resolver seu problema particular de combinação de teclas. Espero que você consiga descobrir isso se eu não o abordar diretamente.

Exemplo: acione somente se o espaço for pressionado.

#If GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed
q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
#If

Exemplo: gatilhos específicos para múltiplas verificações de modificadores dentro do código de atalho.

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers.  q keypress is discarded.

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Exemplo: Envie manualmente o pressionamento de tecla (ou seja, filtragem de modificador hotkey)

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P")) {
        SendInput {Blind}q      ; send q keystroke and allow any pressed modifiers to stay in tact.  If Control is down, Control+q will get sent
        Return  ; continue no further unless Alt+Space are also pressed.  
    }

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Exemplo: o pressionamento de tecla é enviado para o programa, independentemente de você agir ou não.

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
~*q::       ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress has already passed through to program

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Exemplo: Múltiplas definições / ações em uma única tecla de atalho (funciona, mas não a implementação recomendada).

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !GetKeyState("Space", "P")
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    If (GetKeyState("Alt", "P") {
        ToolTip % "Alt+Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    }
Return

Você pode diferenciar quais teclas estão dentro da definição de hotkey e executar seletivamente o código de conjuntos distintos, mas a melhor prática geral é provavelmente usar as instruções #If para determinar quando o código de atalho é executado.

Não use dois #If's em uma linha ... a definição da tecla de atalho é determinada pela última instrução sequencial #If antes da instrução de definição da tecla de atalho ...

; Do Not Use...
#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
#If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))    ; this voids the #If statement above

Deve ser o seguinte abaixo.

; If ahk_class xxx or yyy, and if Alt+Space is also pressed...
#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  && (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))   
; ...
; code goes here
; ...
#IfWinActive ; this sets context for the next hotkeys back to default; only one statement needed; indentation is irrelevant

Observe o uso de parens de agrupamento conforme necessário para combinações lógicas OR / AND ... você pode escapar sem eles em alguns casos, mas tenha o cuidado de combinar cuidadosamente as instruções ao misturar ANDs e ORs.

Esta declaração também pode ser continuada automaticamente em duas linhas (para estilo / legibilidade), pois os operadores booleanos são reconhecidos como continuando a última linha ...

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  
&& (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
;q::    ; q hotkey without modifiers will never trigger here because Alt must be down to get this far
!q::    ; this will trigger
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

Exemplo: Processamento dividido (definição de tecla de atalho interna / externa) (funciona mas não recomenda implementação)

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
!q::
    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

Exemplo: Todo o processamento dentro da definição de tecla de atalho (funciona, mas não a implementação recomendada)

!q::
    If !(WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
        Return

    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

Exemplo final com divisão de código entre teclas de atalho, conforme necessário, e #If declarações selecionando para baixo para ter sempre uma determinada janela de classe ativa e Espaço pressionado ...

#Persistent
Return


#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY")) 
 && GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed

;!Space::Return     ; Optional. Kill the window system menu if present

q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return

d::
    ToolTip % "Space+d pressed..."
    Sleep 500
    ToolTip
Return

!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

Observe que isso não anula o uso de Space ou Alt+Space como pressionamentos de teclas autônomos. Por exemplo, se você pressionar Space e, em seguida, Alt e, em seguida, uma tecla de atalho, ele enviará um Space antes de executar o código Alt+hotkey . Da mesma forma, se você pressionar Alt+Space (digamos, em uma janela normal), ele acionará a janela do sistema no canto superior esquerdo (Restaurar / Mover / Tamanho / Minimizar / Maximizar / Fechar). A funcionalidade de atalho ainda funcionará, mas o menu pode ser um aborrecimento (se você não estiver em uma janela de ferramentas que já exclua este menu), nesse caso você também pode adicionar uma função !Space::Return para eliminar a funcionalidade de Alt+Space enquanto mantém a tecla de atalho. Nesse caso, ele deve ser incluído no bloco de contexto (declaração #If relevante), portanto, só se aplica a essa janela específica.

Existem várias outras maneiras de executar o código para essas combinações de teclas, sem usar GetKeyState () (como observado em algumas das outras respostas) - não vou reduplicar essas informações. Você deve conseguir uma combinação de respostas postadas para fazer o que quiser.

    
por 05.01.2017 / 06:48
3

Tente isso

Space:: Send {Space}

Space & j::
If GetKeyState("Alt")
   Send +{Left}
else
   Send {Left}
Return

Space & e::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

Space & d::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

    ARprecColPickerFn(a, b, c){
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}
    
por 25.11.2016 / 11:24
1

Acho que você só pode iniciar a tecla de atalho com as chaves de ativação !{alt}, +{shift}, ^{ctrl}, win{#} . Você poderia tentar algo em linha isto:

#if getKeyState("space")
!q:: run notepad.exe
#if

Isso iniciará notepad.exe , mas primeiro será executado o botão space .

    
por 24.11.2016 / 23:43
1

Acabei de virar o script de cabeça para baixo e, desse modo, ele permite executá-lo várias vezes sem desmarcar nenhuma tecla, até mesmo você pode armazenar Space & e sem perceber a execução várias vezes.

; THIS WAS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::
    KeyWait,Space,T0.2
    If (ErrorLevel)
    {
        HotstringsEnabled:=true
        KeyWait,Space
        HotstringsEnabled:=false
    }
        else
        Send {Space}    
Return
#If HotstringsEnabled
#Hotstring *

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

!e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
return

d:
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

!d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -2)
#If



; THIS WAS THE FIRST PART OF MY SCRIPT, ITS FOR THE e, +e, d, +d HOTKEYS...
ARprecColPickerFn(a, b, c)
{
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 2)
return

+e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
return

d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
return

+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return
    
por 25.11.2016 / 14:38
0

Em resposta à postagem atualizada ...

Se você fizer com que a tecla de atalho principal seja condicionada a não ter Espaço pressionado, a tecla de atalho não será disparada se o espaço for mantido pressionado. Isso também precisaria ser "desfeito" à medida que o script progredisse, de modo que também haveria uma declaração #IfWinActive para fazer com que essa condição não se aplicasse a outras definições de teclas de acesso abaixo.

A parte superior do script ficaria assim ...

#If !GetKeyState("Space", "P")
+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return

#IfWinActive
; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::

Para a outra pergunta ...

#Hotstring *

... isso coloca a opção * em efeito para todos os hotstrings definidos após essa linha no código.

De #Hostring Tópico da Ajuda:

* (asterisco): Um caractere final (por exemplo, espaço, período ou entrada) não é necessário para acionar a hotstring. Por exemplo:

:*:j@::[email protected]

De volta à arquitetura geral do que você está trabalhando, eu usaria apenas #If condicionais em todas as suas teclas de atalho, como a IGRACH observou, e acabe com o complicado loop de detecção de espaço que ativa / desativa as teclas de atalho.

    
por 26.11.2016 / 22:11
0
  • Este script AutoHotkey deve fazer o que você precisa.
  • Testado no Windows 7.
  • No AutoHotkey, devido à maneira como os teclados são fabricados, várias combinações de teclas apresentam dificuldades, neste caso: uma tecla de atalho com duas teclas não modificadoras (espaço e letras), e a tecla Alt . Outras chaves de problemas incluem CapsLock , Fn e a combinação Win + L .
  • Este script consegue fazer com que uma combinação de teclas desajeitada funcione sem problemas.
  • Este script funciona quando o Notepad é a janela ativa. Use Ctrl + Q para remover as barras de menus / menus que interferem com Alt e Alt + Espaço , e use Ctrl + W para restaurar as barras de menu.

-

;space alt e: +5
;space alt d: -5
;space e: +10
;space d: -10

;ctrl+q: prepare Notepad window (remove menu + sysmenu bars which interfere with alt)
;ctrl+w: restore Notepad window
;ctrl+e: set number to 0
;alt: blocked
;space: blocked
;ctrl+space: send space

vNum := 0

#IfWinActive,ahk_class Notepad

^e::
vNum := 0
Return

^q::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass in Notepad
{
if (hMenu%hWnd% = "")
hMenu%hWnd% := DllCall("GetMenu", "uint", hWnd)
DllCall("SetMenu", "uint", hWnd, "uint", 0) ;hide menu bar
WinSet, Style, -0x80000, ahk_id %hWnd% ;WS_SYSMENU := 0x80000 ;hide system menu
}
Return

^w::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass in Notepad
{
if !(hMenu%hWnd% = "")
DllCall("SetMenu", "uint", hWnd, "uint", hMenu%hWnd%) ;restore menu bar
WinSet, Style, +0x80000, ahk_id %hWnd% ;WS_SYSMENU := 0x80000 ;restore system menu
}
Return

Space & e::
if GetKeyState("Alt", "p")
vNum += 5
else
vNum += 10
ToolTip %vNum%
Return

Space & d::
if GetKeyState("Alt", "p")
vNum -= 5
else
vNum -= 10
ToolTip %vNum%
Return

Alt::
Return

Space::
Return

^Space::
SendInput {Space}
Return

#IfWinActive
    
por 04.01.2017 / 20:58