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.