Sou um usuário do AHK sem experiência ou educação real em programação de computadores (suponho que o Excel seria a coisa mais próxima que tenho de tal conhecimento / experiência, excluindo a hello, world
exposição do dia 1 aqui e ali, ou cmd
/ VB6 lá atrás). Para muitas das minhas tarefas e fluxos de trabalho diários, adotei o uso do AHK, mas a maneira como estou utilizando os scripts sempre foi de entrada literal; em outras palavras, predominantemente apenas entradas de teclas emuladas que produzem sequências de entrada de teclas específicas e superficiais.
De certa forma, isso funciona porque posso utilizar o AHK com pouca ou nenhuma curva de aprendizado - entre outras conveniências - mas obviamente há contras que vêm de mãos dadas com os profissionais. Como tal, fiquei curioso ultimamente para saber se o AHK é capaz de interagir diretamente e invocar ações específicas para programas.
Exemplo conceitual
Vamos pegar o Notepad++, por exemplo (vamos fingir que ele não tem nenhuma funcionalidade nativa para conseguir isso, para fins de exemplo). Desejo configurar uma tecla de atalho para copiar, recortar e colar conteúdo binário . Como -- se possível -- devo abordar a criação do script?
Conceito conjectural
Como parte de minha coleta superficial de informações, tentei correr psr.exe
para ver se poderia capturar alguma informação útil. Infelizmente, não tenho conhecimento suficiente para usar os resultados, mas pensei que poderia haver algum método semelhante para capturar o que está acontecendo no back-end da mesma forma que alguém pode usar o keyboard hook
para possivelmente capturar entradas de chave não padrão . Hospedei os dados resultantes aqui , caso possam ser utilizados.
EDIT: Para esclarecer qualquer confusão, não estou me referindo à especificidade condicional em relação às condições de acionamento de um script (por exemplo, #winactive
). É um pouco difícil descrever mais do que já fiz sem causar mais confusão e fazer com que isso fique muito complicado, eu acho, mas se eu tiver que dar um exemplo análogo, então o que eu quero alcançar pode ser vagamente comparado à execução de um programa com argumentos específicos example.exe -function -parameter
em vez de automatizar o processo de execução example.exe
seguido por pressionamentos de tecla pré-determinados para navegar para a referida função de exemplo Alt + F, F, P
por meio da interface do usuário.
EDIT # 2: Tudo bem, aparentemente ainda não estou transmitindo adequadamente o significado da minha pergunta. Vou fazer mais uma tentativa antes de desistir disso.
Objetivo da amostra:
- Crie uma tecla de atalho que invoque esta função:
- A maneira que eu faria atualmente :
- Atribuir tecla de atalho que aciona uma
send
sequência de entradaAlt + E, P, P, C, Enter
- Atribuir tecla de atalho que aciona uma
- Do jeito que eu quero fazer:
- Atribua uma tecla de atalho que chama diretamente a
Copy Binary Content
função.
- Atribua uma tecla de atalho que chama diretamente a
- Desafios: identificar qual função AHK alcança isso (por exemplo,
DllCall
?), e enumerar os identificadores/argumentos corretos e disponíveis da função - O uso do PSR.exe registra as seguintes ações:
...Etapa 1: Usuário clique com o botão esquerdo em "Editar (item de menu)" em "*ne" Programa: NOTEPAD++.EXE Elementos da interface do usuário: Editar, Aplicativo, *novo 1 - Notepad++ [Administrador], Notepad++
Etapa 2: Usuário clique com o botão esquerdo em "Copiar conteúdo binário (item de menu)" Programa: NOTEPAD++.EXE Elementos da interface do usuário: Copiar conteúdo binário, Colar especial, nº 32768, *novo 1 - Notepad++ [Administrador], Notepad++...
Observe o "#32768" ! Existe uma maneira de chamar diretamente essa função?
Entendo a questão conforme delineada e faz muito sentido, pois tentei (e consegui) fazer isso em vários graus com diferentes programas.
Existem alguns métodos para fazer o que você procura, listados em ordem crescente de complexidade abaixo (na minha opinião)...
WinMenuSelectItem
Para iniciantes, a abordagem abaixo do ideal é
WinMenuSelectItem
para programas que possuem menus padrão do Windows (em vez da faixa de opções, por exemplo).Esse método pode evitar a necessidade de enviar todas as teclas digitadas apenas para acionar uma opção de menu existente. No entanto, fazer com que esses
WinMenuSelectItem
comandos funcionem às vezes é complicado e pode não ser tão simples de depurar se não estiver funcionando corretamente (se transforma em tentativa e erro). Às vezes, desisti completamente de tentar fazer esse trabalho e voltei a usar as teclas digitadas.No entanto, uma vez que uma determinada função está funcionando com este método, a janela não precisa necessariamente estar ativa para executá-la, o que é bom.
PostMessage/SendMessage
O segundo método para programas padrão do Windows é usar
PostMessage
ouSendMessage
. Usando um inspetor do Windows (Spy ++? Existem outros populares também, mas não me lembro o nome de imediato. Talvez uma das ferramentas do Sysinternals?), Você pode registrar essas mensagens e ver o que a função de menu aciona quando você faz isso manualmente e, em seguida, envie essa mensagem. Você basicamente registraria todas as mensagens do Windows e, em seguida, filtraria apenas essa janela para ver o que é enviado e tentaria replicá-lo no código.Este é provavelmente um exemplo ruim, mas um trecho de código aleatório utilizando SendMessage:
Objetos COM
Para programas do tipo Microsoft Office, a melhor maneira de obter 'nos bastidores' é conectar-se via COM Objects, que então expõe essencialmente todos os modelos de objeto que já estão disponíveis no VBA. Isso é fantástico para fazer o que você precisa no Word/Excel/etc. já que você pode apenas procurar o código VBA para ele e, em seguida, implementar um equivalente no AutoHotkey apenas para realizar uma tarefa específica. Outra vantagem é que ele não requer privilégios de macro para se conectar ao programa e executar algo, ele [Word/Excel/etc.] só precisa estar em execução.
Acessibilidade
Por último, mas não menos importante, a acessibilidade pode ser utilizada para localizar e executar funções que não estão em um menu padrão, mas existem no layout da GUI de um programa ou barra de ferramentas. Isso geralmente é muito mais avançado e tedioso, mas pode encontrar coisas "nos bastidores" que você não conseguiria executar de outra forma sem apenas usar teclas / cliques do mouse.
Normalmente, você precisa usar um visualizador de árvore de acessibilidade para pesquisar uma configuração de GUI específica para encontrar o que deseja executar e, em seguida, passar uma referência de árvore para o código que chamará essa função, "pressione" ou "clique" no botão , etc. Isso é mais útil nos casos em que os controles padrão do Windows não são usados e você apenas obtém uma
NETUIHWND1
referência ao passar o mouse sobre um controle durante a execução do Window Spy. A acessibilidade permite que você realmente se aprofunde na construção dissoNETUIHWND1
para encontrar e/ou executar algo dentro dele (texto, botões, etc.)Resumo
Isso pode ser feito? Sim. Obviamente, há muita programação envolvida com algumas dessas opções, mas esses são os tópicos que eu recomendaria começar se você for pesquisar os arquivos de ajuda e fóruns do AutoHotkey.