Suporte Gio, Pode Me Ajudar? Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Lucassntos2
Posts: 4
Joined: 06 Jul 2020, 12:31
Facebook: https://www.facebook.com/profile.php?id=1000406519
Google: https://myaccount.google.com/?utm_source=OGB&tab=w
GitHub: Lucassntos

Suporte Gio, Pode Me Ajudar?

06 Aug 2020, 22:03

Eu tentei fazer outra versão do 360 para esquerda, mais ele só vai para direita, já tentei mudar tudo, e tentar colocar -1 igual no anterior que você resolveu, mais estou quebrando a cabeça, para ele movimentar para esquerda


q::



Loop 10 {
DllCall("mouse_event", "UInt", 0x01, "UInt", 265, "UInt", 0) ; move 1 unit right
Sleep 10
}
return
User avatar
Gio
Posts: 1038
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Suporte Gio, Pode Me Ajudar?  Topic is solved

07 Aug 2020, 08:37

Bom dia Lucassntos2.

Primeiro um esclarecimento: Não sou suporte, sou moderador. Minha ajuda respondendo aos tópicos é como qualquer outro usuário do fórum. Qualquer usuário pode ajudar contribuindo com qualquer tópico dos nossos fórums ou escrevendo tópicos novos em qualquer uma das salas.

Tendo dito isto, vamos a sua pergunta.

Eu tentei fazer outra versão do 360 para esquerda, mais ele só vai para direita, já tentei mudar tudo, e tentar colocar -1 igual no anterior que você resolveu, mais estou quebrando a cabeça, para ele movimentar para esquerda
Podemos entender o que está acontecer comparando o seu código atual (que só vai para a direita) com o código antigo (que vai para ambos os lados).

O código ATUAL (que não vai para a esquerda) é este:
DllCall("mouse_event", "UInt", 0x01, "UInt", 265, "UInt", 0)

Já o código ANTIGO (que permite ir para a esquerda) é este:
DllCall("mouse_event", uint, 1, int, (-1 * VELOCIDADE), int, 0, uint, 0, int, 0)

:arrow: Agora vamos analisar os dois códigos:

1. Ambos fazem uma chamada à função mouse_event() que se encontra em uma das DLLs nativas do Windows (sei disso porque você não precisou colocar o caminho completo do arquivo .dll para acessar a função).

2. Esta função requer alguns parâmetros, mas tem alguns parâmetros opcionais também (sei disso porque na chamada antiga você usou 5 parâmetros, e na nova usou apenas 3).

3. O tipo dos parâmetros está variando entre suas chamadas (este é o culpado pelo "problema").

:arrow: Quando se faz uma chamada através de DllCall(), antes de especificar os valores dos parâmetros, devemos especificar o tipo dos valores. Fazemos isso colocando a sintaxe assim: DllCall("nome_da_funcao", Tipo_Par_1, Valor_Par_1, Tipo_Par_2, Valor_Par_2, Tipo_Par_3, Valor_Par_3, ...).

Sobre os tipos de valores, saiba o seguinte: No AutoHotkey temos apenas dois tipos de valores (texto e matemático), mas nas outras linguagens não é necessariamente assim. Por isso você precisa sempre especificar em DllCall()s quais os tipos de valores você está colocando em cada parâmetro (podem ser por exemplo: Integers, Pointers, UnsignedInteger, String, Short, Char, Float, Double, etc; cada um tendo seus nomes reduzidos na chamada: Int, Ptr, Uint, Str, Short, Char, Float, Double).

:arrow: Estes tipos de valores existem para que o sistema operacional e outros programas possam melhor alocar a memória.

Float, por exemplo, significa que um valor é um número com até 6 casas decimais (portanto o valor dos bytes vai seguir uma ordenação que tem que ser interpretada especificamente para dizer onde está a vírgula). Já o Integer significa que o valor é um número inteiro (portanto, todos os bits contribuem para o número, o que significa que números maiores podem ser armazenadas em menos bytes, mas em contrapartida perdemos a capacidade de formar casas decimais). Char, por outro lado, signfica que o valor deve ser interpretado como um caractere (texto).

:arrow: No caso das chamadas que você fez, só foram usados dois tipos de valores: Int (integer) e Uint (Unsigned Integer). O Int é o tipo de valor para números inteiros, mas apesar de não permitir números quebrados, ele permite números negativos. Isso significa que ele NÃO é a mesma coisa que o Uint (UnsignedInteger) que é o tipo de valor para números inteiros e positivos.

Portanto, quando você trocou o tipo do segundo parâmetro de int para Uint você fez que o valor não pudesse mais ser interpretado como negativo, ainda que tivesse um símbolo -. Desta forma, a diferença entre as duas chamadas (e aquilo que ocasionou o problema) foi o uso do tipo Uint para o segundo parâmetro, nesta nova chamada. Troque Uint de volta para Int no segundo parâmetro e você poderá ir para a esquerda de novo.

Code: Select all

Loop 10 {
DllCall("mouse_event", "UInt", 0x01, "Int", -15, "UInt", 0) ; move 1 unit right
Sleep 10
}
return

Mais informações sobre DllCall(), incluindo uma tabela descritiva com todos os tipos, podem ser encontradas aqui.

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

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 1 guest