Faça uma chave se comportar como um comutador ou uma chave normal com base em quanto tempo ela foi mantida pressionada, usando o AutoHotKey

0

Atualmente, estou usando o AutoHotKey para simular o mapeamento das teclas do Happy Hacking Keyboard Pro 2 em um Topre Realforce 89.

O script que criei está disponível no github .

Eu usei a chave japonesa "muhenkan" (SC07B) para simular a chave Fn e adicionei todos os mapeamentos de teclas de combinação Fn como nos dois exemplos abaixo :

SC07B & SC002::send,{Blind}{F1} ; Fn + 1 -> F1
SC07B & SC01A::send,{Blind}{Up} ; Fn + [ -> Up

Estando localizado no lado esquerdo e direito da tecla Space, eu também quero usar "muhenkan" e "henkan" (SC079) como Enter e Backspace .

Remapear "henkan" para Backspace é feito facilmente com:

SC079::send,{BS}
+SC079::send,{BS}
^SC079::send,^{BS}

Em relação ao "muhenkan", que é usado como tecla de chave Fn , eu o mapeei para a tecla Enter com a seguinte linha:

SC07B::send,{Enter}

Parece que não há conflito com ele sendo usado como Fn e Enter:

  • quando combinado com outra chave, não gera saída Enter
  • quando nenhuma outra chave é combinada, ela exibe Enter após ser liberada

Há momentos em que eu posso pressionar a tecla Fn com a intenção de combiná-la com outra tecla, e eventualmente desistir dessa intenção liberando a tecla Fn .

O problema é que, ao liberar a chave, ela gera Enter, o que não é ideal.

Eu gostaria de melhorar isso configurando a chave Fn para que, quando liberada, ela apenas forneça Enter se as duas condições a seguir forem atendidas:

  • nenhuma outra tecla foi pressionada entre a duração da tecla Fn foi pressionada e liberada
  • a duração entre pressionar / soltar ( PARA BAIXO / PARA CIMA ) foi menor que um determinado valor (ex .: 500ms)

Existe uma maneira simples de modificar minha configuração AutoHotKey para continuar usando o SC07B como uma chave de comutação ( Fn ) e também mapeá-lo para Enter com as condições anteriores?

O fato de eu definir combinações de teclas parece fazer o mapeamento para Enter funcionar na liberação da chave, que é o que eu quero, mas também significa que não posso usar o KeyWait e verificar o tempo limite, Acredito que os comandos só começarão depois da liberação da chave (o que não faz sentido).

A_TimeSincePriorHotkey também não é utilizável, pois não reflete o tempo gasto entre a tecla de atalho atual sendo pressionada e liberada.

    
por killy971 04.06.2013 / 06:24

1 resposta

0

É assim que você pode usar A_TickCount e KeyWait para determinar por quanto tempo uma tecla foi pressionada:

LCtrl:: ;hotkey has 3 different functions based on press duration
    keyDown := A_TickCount
    Keywait LCtrl
    If ((A_TickCount-keyDown) < 300)
        Send {Enter}
    If ((A_TickCount-keyDown) > 300) and ((A_TickCount-keyDown) < 600)
        Send {Left}
    If ((A_TickCount-keyDown) > 600)
        Send {Right}
Return

No entanto, isso NÃO permite que você use a chave em combinação (por exemplo, Ctrl + a ).

Para realizar essa tarefa, você deve usar While GetKeyState() da seguinte forma:

RCtrl::
    keyDown := A_TickCount
    While GetKeyState("RCtrl", "P")
        Send {Ctrl Down}
    duration := A_TickCount - keyDown
    Send {Ctrl Up}
    if duration < 300
        Send {Enter}
    Return

Isso permitirá que você ainda execute combinações de teclas como Ctrl + a , etc. Deixe-me saber se essa resposta funciona para você.

    
por 05.06.2013 / 17:24