Mapeando um conjunto específico de pressionamentos de tecla para outros pressionamentos de tecla usando o AutoHotkey?

1

Estou tentando mapear o gesto de passar o dedo com três dedos no meu touchpad para Ctrl + Win + Left ou Ctrl + Win + Right (alternando entre áreas de trabalho virtuais). Aqui estão as teclas pressionadas quando eu deslizei para a esquerda:

VK  SC  Type    Up/Dn   Elapsed Key     Window
-------------------------------------------------------
A2  01D a   d   1.08    LControl        
A4  038 a   d   0.00    LAlt            
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.20    Enter           Task Switching
0D  01C a   u   0.00    Enter   

E quando deslizo para a direita:

VK  SC  Type    Up/Dn   Elapsed Key     Window
-----------------------------------------------
A2  01D a   d   1.69    LControl        
A4  038 a   d   0.00    LAlt            
A0  02A a   d   0.00    LShift          
09  00F a   d   0.00    Tab             
09  00F a   u   0.00    Tab             
A0  02A a   u   0.01    LShift          
A4  038 a   u   0.00    LAlt            
A2  01D a   u   0.00    LControl        
0D  01C a   d   0.16    Enter           Task Switching
0D  01C a   u   0.00    Enter  

Como mapeio estes para Ctrl + Win + Left e Ctrl + Win + Right?

Eu tentei este Alt & Ctrl & Enter & Tab::Send test , mas está dizendo que é um programa inválido.

Caso seja relevante, estou usando o Windows 10 em um Thinkpad L440 com o driver do touchpad Synaptics.

    
por Leo Jiang 08.12.2016 / 07:50

2 respostas

0

Depois de uma ou duas horas de ajustes, descobri:

swipeDirection := ""

^!Tab::
    swipeDirection := "L"
return

^!+Tab::
    swipeDirection := "R"
return

$Enter::
    if (not swipeDirection) {
        SendInput {Enter}
    } else if (swipeDirection = "L") {
        SendInput ^#{Left}
    } else if (swipeDirection = "R") {
        SendInput ^#{Right}
    }
    swipeDirection := ""
return

Deixe-me saber se existe um método melhor!

Editar:

Eu escrevi sobre isso no meu blog: link

    
por 09.12.2016 / 09:48
0

A seleção Enter a é baseada em um diálogo? Se sim, então não seria enviado como parte da automação.

Eu acredito que o seguinte código deve gerar os keylogs listados, mas não testados ...

^#Left::
    SendInput ^!{Tab}
    SendInput {Enter}    ; use only if needed
Return

^#Right::
    SendInput ^!+{Tab}
    SendInput {Enter}
 Return

Procure nos arquivos de ajuda da Lista de Chaves e da lista de modificadores

^ = Control
! = Alt
# = Win
+ = Shift

Além disso, se este for um novo recurso específico do Windows 10, as chaves podem não funcionar exatamente como desejado e você pode precisar usar AltTab e ShiftAltTab com um modificador de tecla Control. Nas versões anteriores do Windows, essas combinações podem ter um comportamento especial, portanto, há um caso especial (consulte AltTab nos arquivos de ajuda).

Você também pode tentar manualmente as teclas para ver se faz o que o furto faz. Se tentar manualmente funciona, então os pressionamentos de tecla AutoHotkey devem funcionar sem a necessidade de usar algo especial. Por exemplo, pressione Ctrl + Alt + Tab (para baixo, para cima) e depois Enter (para baixo, para cima) ou pressione Shift + Ctrl + Alt + Tab (para baixo, para cima) e Enter (para baixo, para cima). Isso é o que os registros de pressionamento de tecla indicam com os caracteres d e u .

EDITAR ...

Com base no subsequente post de acompanhamento, vejo por que o código acima é funcionalmente ao contrário (não entendi totalmente a pergunta inicialmente, mas deixarei minha postagem original como está).

Em resposta à questão de "um método melhor", o código postado já parece ótimo e é muito simples (não há razão para alterá-lo realmente) - duas possíveis diferenças de estilo abaixo são apenas para mostrar algumas variações possíveis na resposta a a questão - código que pode ser 'mais limpo' usando variáveis de atalho embutidas e operadores ternários.

Primeiro, as variáveis de teclas de atalho A_ThisHotkey e A_PriorHotkey podem ser usadas para detectar a tecla de atalho atual e a última tecla de atalho disparada. Isso permite simplificar a atribuição de variáveis eliminando a variável usada para rastrear qual delas foi acionada por último. As definições das teclas de atalho ainda precisam estar no lugar, então o evento é capturado e descartado, mas eles não precisam fazer nada além de retornar.

^!Tab::return
^!+Tab::return
$Enter::
    if (A_PriorHotkey="^!Tab") {
        SendInput ^#{Left}
    } else if (A_PriorHotkey="^!+Tab") {
        SendInput ^#{Right}
    } else
        SendInput {Enter}
return

Você pode ver como isso está parecendo um pouco mais simples e menos disseminado.

A variação final é usar agora um operador ternário para efetivamente fazer uma declaração If-Then-Else e combinar tudo em uma única instrução:

^!Tab::Return
^!+Tab::Return
$Enter::SendInput % (A_PriorHotkey="^!Tab") ? "^#{Left}" : (A_PriorHotkey="^!+Tab") ? "^#{Right}" : "{Enter}"       ; Final 'Else' Statement

Abaixo de três linhas de código, mas não das mais legíveis.

Fazendo uso de uma permissão AutoHotkey final, a linha única pode ser dividida usando operadores de continuação automáticos quando as linhas começam com uma vírgula, dois pontos ou um período para vincular as coisas ... isso permite o uso de quebras de linha lógicas e para uma estrutura If-Then-Else bastante clara com o operador ternary ? , sem ter um monte de instruções If-Then-Else-Else-Else.

O código final seria algo como isto ...

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                  : "{Enter}"    ; Final 'Else' Statement

Ou com espaçamento alternativo no 'Else' final para manter todos os argumentos Enviar alinhados verticalmente ...

^!Tab::return
^!+Tab::return
$Enter::SendInput % (A_PriorHotkey="^!Tab")  ? "^#{Left}"
                  : (A_PriorHotkey="^!+Tab") ? "^#{Right}"
                                             : "{Enter}"      ; Final 'Else' Statement

Uma nota final - não posso testar os trechos do código acima, embora eu acredite que eles devam funcionar conforme listado. Eles são todos apenas atualizações de estilo, como observado (ou seja, atualizações para o código de acompanhamento postado já pelo usuário que postou a pergunta original) - não há diferenças funcionais, apenas alguns recursos que o AutoHotkey oferece se você continuar desenvolvendo.

    
por 09.12.2016 / 08:27