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
Suporte Gio, Pode Me Ajudar? Topic is solved
Moderator: Gio
-
- Posts: 4
- Joined: 06 Jul 2020, 12:31
- Contact:
Re: Suporte Gio, Pode Me Ajudar? Topic is solved
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.
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)
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").
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).
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).
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.
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
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.
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).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
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)
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").
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).
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).
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
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Return to “Ajuda e Suporte Geral”
Who is online
Users browsing this forum: No registered users and 37 guests