Existe alguma maneira do Autohotkey funcionar em outros Sistemas Operacionais como o Linux, por exemplo?
É possível?
Se não me engano havia um projeto chamado IronAHK, mas não sei em que ponto do desenvolvimento ele se encontra. Acho até que não está mais sendo desenvolvido. Então, infelizmente nada de AutoHotkey para Linux por enquanto.
Terei que mapear manualmente sempre cada um deles?
Não, basta escrever o código de modo que a mapeação seja automática.
Pois bem, meu desejo é que o script também consiga localizar os links automaticamente e associá-los as teclas necessárias para interpretar como um clique.
O que você tá querendo fazer na verdade é fácil de fazer. O problema é somente que isso é uma tarefa grande (um projeto), e como qualquer tarefa grande, você terá que dividí-la em várias tarefinhas menores, para depois ir programando elas uma a uma ao longo do tempo (isso é o que chamamos de desenvolvimento). Eu vou te dar um exemplo. O script abaixo abre uma janela com vários botões. Ele também cria uma hotkey F2 que quando você pressiona, mapeia todos os botões da tela e exibe uns balões com as iniciais de cada um. Depois, se você aperta uma inicial qualquer, ele aciona o botão correspondente.
Code: Select all
#SingleInstance, Force
; PASSO 1: CRIAMOS UMA TELA PARA EXEMPLIFICAR O MÉTODO DE CRIAR OS BALÕES PARA OS BOTÕES.
; A TELA CONSISTE APENAS EM UM NÚMERO GRANDE DE BOTÕES DE EXEMPLO, TODOS COM INICIAIS DIFERENTES
; (POIS AINDA ESTAMOS ADOTANDO O MÉTODO DAS INICIAIS, SEM DIFERENCIAR BOTÕES COM MESMA INICIAL NESTE EXEMPLO)
Gui, Add, Edit
Gui, add, button, gAcoes, Salvar
Gui, Add, Edit
Gui, add, button, gAcoes, Carregar
Gui, Add, Edit
Gui, add, button, gAcoes, Rodar
Gui, Add, Edit
Gui, add, button, gAcoes, Executar
Gui, Add, Edit
Gui, add, button,gAcoes, Verificar
Gui, Add, Edit
Gui, add, button,gAcoes, Terminar
Gui, Add, Edit
Gui, add, button,gAcoes, Arquivar
Gui, Add, Edit
Gui, show, w300 h500, Exemplo
return
; PASSO 2:
; E CRIAMOS UMA LABEL PARA EXECUTAR AS AÇÕES QUANDO QUALQUER DOS BOTÕES FOR PRESSIONADO
; (TAMBÉM É POSSÍVEL CRIAR UMA LABEL PARA CADA BOTÃO, MAS DESSE JEITO FICA MAIS FÁCIL O EXEMPLO).
Acoes:
If !(CURRENT_HOTKEY = "") ; SE A VARIÁVEL COM O NOME DA HOTKEY CHAMADA TIVER ALGUM DADO, ESTA LABEL FOI CHAMADA ATRAVÉS DE HOTKEY. DAÍ EXECUTA O LOOP ABAIXO.
{
Loop 20 ; LOOP 20, PARA VERIFICAR OS TEXTOS DE TODOS OS BOTÕES QUE COLETAMOS.
{
If (SubStr(CTRL_NAME_%A_Index%, 1, 1) = CURRENT_HOTKEY) ; SE A INICIAL DO TEXTO DO BOTÃO FOR O MESMO DA HOTKEY CLICADA...
{
CURRENT_CONTROL := CTRL_NAME_%A_Index% ; DESIGNA AQUELE BOTÃO COMO SENDO O CONTROLE A OPERAR.
}
}
ControlSend, %CURRENT_CONTROL%, %A_Space%, A ; E MANDA UM ESPAÇO PARA O BOTÃO (PARA ATIVÁ-LO).
CURRENT_HOTKEY := "", ; DEPOIS LIMPA AS VARIÁVEIS QUE SE USA EM CADA CHAMADA (PARA PREPARAR PARA A PRÓXIMA CHAMADA).
CURRENT_CONTROL := "" ; O MESMO DE CIMA.
Return ; TERMINA A EXECUÇÃO.
}
msgbox, Você Pressionou %A_GuiControl% ; ESTA LINHA É A OPERAÇÃO DO BOTÃO. ELA OCORRE SEM O CÓDIGO ACIMA SE VOCÊ CLICAR NO BOTÃO E APÓS O CÓDIGO ACIMA SE VOCÊ CLICAR NA HOTKEY (VEJA QUE A HOTKEY CHAMA A LABEL DE NOVO COM UM ESPAÇO, E NESSA SEGUNDA CHAMADA NÃO TEM MAIS INDICAÇÃO DE ACIONAMENTO POR HOTKEY).
Return
; PASSO 3: CRIAMOS UMA LABEL PARA REINICIAR UMA VARIÁVEL QUE CONTÉM A ÚLTIMA HOTKEY.
; ISSO SÓ FOI FEITO PARA NÃO MODIFICARMOS O CONTEÚDO DA VARIÁVEL EMBUTIDA A_ThisHotkey DIRETAMENTE.
Hotkeys_pressionadas:
CURRENT_HOTKEY := A_ThisHotKey ; SE PRESSIONARMOS A HOTKEY, PREENCHE A VARIÁVEL COM O NOME DA HOTKEY CHAMADA.
Gosub, Acoes
Return
; PASSO 4: CRIAMOS UMA HOTKEY F2, QUE QUANDO FOR PRESSIONADA, ANALISA A TELA ATIVA (QUE É A NOSSA SE VOCÊ EXECUTOU O SCRIPT E JÁ CLICOU,
; MAS PODE SER OUTRA. A QUESTÃO É QUE NO MOMENTO O SCRIPT É MUITO FRACO PARA TRABALHAR COM TODO E QUALQUER TIPO DE TELA E BOTÃO, MAS PODE
; FUNCIONAR EM ALGUMAS. FUNCIONOU RELATIVAMENTE NA TELA DO SCITE4AUTOHOTKEY, POR EXEMPLO)
F2::
Loop, 20 ; LOOP 20, POIS O TOOLTIP FUNCIONA APENAS COM 20 ENTRADAS NO MÁXIMO.
{
ControlGetText, CTRL_NAME_%A_Index%, Button%A_Index%, A ; COLETA OS TEXTOS DOS BOTÕES DA TELA ATIVA AUTOMATICAMENTE BASEADO EM LOOP E A_INDEX.
ControlGetPos, CTRL_X_%A_Index%, CTRL_Y_%A_Index%, CTRL_W_%A_Index%, CTRL_H_%A_Index%, Button%A_Index%, A ; COLETA AS POSIÇÕES DOS CONTROLES.
HOTKEY_NAME := SubStr(CTRL_NAME_%A_Index%, 1, 1) ; PEGA A INICIAL DO TEXTO DO CONTROLE PARA CRIAR A HOTKEY ASSOCIADA DEPOIS.
If (A_Index <= 20)
{
ToolTip, %HOTKEY_NAME%, % CTRL_X_%A_Index% + CTRL_W_%A_Index%, CTRL_Y_%A_Index% + CTRL_H_%A_Index%, %A_Index% ; CRIA UM BALÃO PARA CADA BOTÃO.
If !(HOTKEY_NAME = "") ; SE O TEXTO DO BOTÃO ESTIVER EM BRANCO, NÃO RODA O CÓDIGO ABAIXO.
{
HotKey, %HOTKEY_NAME%, Hotkeys_pressionadas ; GERA A HOTKEY.
}
}
}
Return
Este código pode até ser um ponto de partida. Veja que ele até funciona em
algumas outras janelas do Windows que tenham botões, pois ele opera na janela ativa. Mas veja que ainda tem muita coisa pra fazer. Tem várias situações que tem que ser decididas, como por exemplo, "o que fazer quando dois botões tiverem a mesma inicial?" ou então "o que fazer em telas com mais de 20 controles?" ou então "o que fazer com botões que não pertencem à ClassNN
Button?" E assim sucessivamente. Todas essas decisões, que provavelmente serão dezenas ou até centenas, você terá que tomar ao longo do desenvolvimento, ajustando o código para cada uma até que fique conforme a sua ideia geral.
É assim que programação funciona. Dividindo uma tarefa grande em tarefas menores. Também vale dizer que é quase impossível responder "Como crio um Word?", mas é até possível explicar "Como crio um botão de centralizar texto?" (que é um passo para fazer um Word). E sendo assim, quando você se deparar com um problema que não saiba resolver em uma dessas tarefas pequenas, sinta-se livre para perguntar aqui no fórum, mesmo que sejam vários, até que consiga terminar seu desenvolvimento