Comando SEND executando fora de ordem

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Comando SEND executando fora de ordem

Re: Comando SEND executando fora de ordem

Post by Gio » 22 Oct 2019, 09:27

Bom dia Wantows.

Seja bem-vindo ao fórum da comunidade do AutoHotkey.

O script sempre executa os comandos na ordem que você os escreve. O problema que você relata, no entanto, é comum, mas ocorre normalmente porque o programa alvo (ou o windows) podem simplesmente ignorar uma tecla de vez em quando (principalmente se forem executadas em sequências rápidas e em um loop, como o caso do código postado).

:arrow: Você já deve ter visto que as vezes a janela de um programa pode parar de responder por alguns segundos (ficando esbranquiçada se demorar demais)? Esse lapso pode ocorrer em intervalos bem pequenos também. Por este motivo, automação de telas de programas de terceiros (incluindo jogos) requer códigos mais elaborados se a confiabilidade e a sequência certa de comandos forem muito importantes.

Vejo que você colocou comandos Sleep entre as teclas. O uso do sleep serve para o caso de a tela alvo tiver o comportamento de ignorar comandos de tecla muitos rápidos e também serve para o caso de a ação correspondente no programa alvo levar um tempo para ser executada, mas o Sleep não te resguarda caso o programa alvo pare de responder no exato momento que um comando de tecla foi enviado (pois nesse caso não importa se você esperou 1 ou 10 segundos antes disso). Dessa forma eu sugiro que antes de elaborar seu código você estude as maneiras de sondar o resultado do envio do comando da tecla antes de passar para a próxima tecla.

Exemplos:

1. O comando ControlGet (por exemplo) te permite descobrir se um controle da janela (como um checkbox, por exemplo) foi marcado. Você pode então clicar no checkbox e antes de apertar enter verificar se ele de fato foi marcado.
2. O comando ControlGetText te permite verificar qual o texto inserido em um campo de edição (podendo portanto ser usado para ver se o Send escreveu corretamente a informação lá).
3. A função WinExist() te permite verificar se uma nova janela foi aberta (por exemplo, se o resultado esperado do clique for a abertura de uma janela, você pode usar esse comando para ver se a janela de fato abriu).

Os comandos acima podem ser executados em loop, com intervalos, e com condicionais de acordo com o resultado obtido (resultando em uma "inteligência" maior no seu script, que vai sempre verificar se tudo deu certo antes de prosseguir pro próximo comando).

:arrow: Para o caso de jogos muitas vezes esses comandos de tela não são adequados, mas você pode criar rotinas que busquem as cores de pixels alvo para verificar se o resultado esperado ocorreu (exemplo: se o clique foi pra ativar uma magia e o símbolo da magia fica brilhoso quando você a ativa, você pode verificar na sequência se o pixel do lugar da magia está nessa cor antes de prosseguir. Se não estiver, espera mais e verifica de novo.... Se ainda assim não estiver, clica de novo... e assim sucessivamente até que somente quando estiver na cor certa você prossegue pro próximo comando). Use o comando PixelGetColor para implementar esse tipo de rotina.

:arrow: Se ficar muito difícil escrever o script com essa "inteligência", você também pode ver se existe uma maneira confiável de "cancelar" ações que estejam na metade. Por exemplo, em alguns jogos você clica em um lugar na tela e o boneco cancela a execução da magia. Assim, você pode implementar um clique na tela logo após a sequência, de modo que o início do loop sempre ocorra no estado adequado do jogo alvo (se a magia ocorreu normalmente tudo bem, pois já terminou, e se ficou na metade tudo bem também, pois cancelará).

Enfim, esse é um assunto um pouco extenso, mas acho que deu pra ter uma ideia do que eu quiz dizer. Já trabalhei com algumas automações de tela de programa de terceiro e acredite, as vezes alguns checks de estado ajudam muito na confiabilidade.

Espero ter ajudado, mas se ainda tiver algum dúvida basta postar abaixo :thumbup:

Comando SEND executando fora de ordem

Post by wantows » 21 Oct 2019, 18:18

Olá pessoal, estou tentando desenvolver um programa que execute ações no teclado, e estou usando o comando SEND, {TECLA}
Mas ao executar essas ações, ele executa fora de ordem, as vezes faz na ordem certa, as vezes na ordem errada.
Queria saber se tem como fazer com que ele execute dentro de uma condição, exemplo:
If(SEND OK) - Se o SEND, {TECLA 1} for executado, ele vai para o SEND, {TECLA 2} e assim por diante.
Poderiam me ajudar?
Este é meu código atual.

Code: Select all

 
Q::
    Loop
    {
        Send {Ctrl}
        sleep,50
        Send {RButton}
        sleep,50
        Send {Ctrl}
        sleep,50
        Send {LButton}
        return
    }
    return

Top