Página 1 de 1

Crear una Macro en el teclado

Publicado: 10 Abr 2011, 23:32
por Hate.
Si este es el problema yo usaba el autohotkey que sirve solamente para eso para crear macros
quería crear una macro para un juego.
Al darle a la tecla "4" se debería presionar: Space, (la tecla: 1)y space (uno después del otro)

consegui crear esto:

Código: Seleccionar todo

$4::
while GetKeyState("4", "P")
IfWinActive, S4 Client   <--- esto para que sepa donde tiene q hacer el comando
{
Send space  <---- Este comando lo que hizo fue que al meter el chat del juego escribiese "space" pero yo lo que quería es que saltara - presionara space -
}
{
 Click WheelUp  (Esto lo puse en substitución de la tecla "1" porq hace lo mismo en el juego)
}
{
Send space
}
return

Eso es lo que logre hacer (casi nada ....)

Pero con Autoit, no se ni los comando ._.

una ayudita ...·····....·······.......····..

Re: Crear una Macro en el teclado

Publicado: 11 Abr 2011, 07:36
por ms999
Hate!! si sos [H]ate o noseque caracol entonces te conozco!! :) soy monoscout del SLP y lo que queres hacer es un BOT para S4League, que haga ReloadCancel aver si puedo ayudarte....

Código: Seleccionar todo

While winactive("S4 Client")
	If _ispressed(34) Then
		send("{SPACE}")
;~ 		sleep(xxxx)
		MouseWheel("up",10)
;~ 		sleep(xxxx)
		send("{SPACE}")
	EndIf
Wend
No lo probe con el juego pero eso es masomenos lo que queres... fijate que 2 cosas,
1- En los sleep que estan anulados ahi, tendrias que fijarte cuanto tiempo tendria que tardar entre que aprieta la barra y gira la ruedita del mouse, proba con diferentes valores.
2- En mousewheel el valor de 10 quiza sirva o quiza no,, probalo asi si no cambialo... sino proba con otro send y mandale el numero directamente...

Si te falta algo mas no dudes en preguntar, hacele una GUI y todo ;)

Re: Crear una Macro en el teclado

Publicado: 11 Abr 2011, 13:58
por Ximorro
Quizás sea más difícil al intercalar el ratón. Siendo que la tecla "1" es lo mismo se puede poner con un Send:
Send({SPACE}1{SPACE})
Por cierto, que si el "1" tiene que ser necesariamente el del teclado numérico entonces se pone como "{NUMPAD1}"

Para las pausas entre teclas se puede hacer como te hace ms999 separando cada una y poniendo Sleep en medio. O lo haces así todo en una línea y si ves que va muy rápido puedes poner al principio del programa una directiva que hace precisamente eso, especificar el tiempo entre pulsaciones de tecla para Send:
Opt("SendKeyDelay", 5) ;Por defecto es 5 milisegundos, que es muy poco, prueba a ponerle más (o a hacer lo de los Sleep)

Re: Crear una Macro en el teclado

Publicado: 11 Abr 2011, 17:08
por Hate.
Send ("{SPACE}") sirve para presionar la barra espaciadora , ok

pero Send 1 ¿también presiona la tecla 1 ? o la escribe 1?
o debo poner? Send ("{1}")


Send Opt("SendKeyDelay", 5) son 5 milisegundos entonces Opt("SendKeyDelay", 20.000) son 20 segundos?

Perdón por molestar debería leerme los tutos y de mas que tenéis, seguro que contestáis a las preguntas q estoy haciendo en este mismo momento [:-:]

Por ahora tengo esto:

Código: Seleccionar todo

Send Opt("SendKeyDelay", 1.000)  ; 1 segundo
While winactive("S4 Client")
   If _ispressed(34) Then
      send({SPACE}1{SPACE})  ; con 1 segundo entre tecla y tecla 
;~                    
   EndIf
Wend

No lo puedo probar hasta el viernes así que si ms999 me lo prueba le estaré muy agradecido

Re: Crear una Macro en el teclado

Publicado: 11 Abr 2011, 18:02
por ms999
¿Sos RuidosoCascabel?

Bueno en partes...

1. Me olvide de que para usar la función _ispressed tenes que poner la include <Misc.au3> al principio del code. O sino podes usar la función Hotkeyset()
2. "Send ; 1 segundo", esto esta mal no tenes porque poner send adelante, la funcion send es para "Envía pulsaciones simuladas de teclas a la ventana activa".
3. Lo que decis de que 1000 ms es un segundo es correcto :)
4. Yo utilizaría los sleep() porque se para que es y se que las demoras entre cada acción(tecla oprimida) no es la misma
5. Usa la ayuda que sirve(apreta F1 sobre la función que deseas saber que es y como se usa) y mucho para aprender autoit y una vez que la aprendes a interpretar es muy sencilla.
6. Lo voy a probar.

Este seria el script echo. Lo que faltaría es ver los sleep de cuanto tienen que ser, si el valor va a ser el mismo en ambos uso la opcion que menciono Ximorro Opt("SendKeyDelay", xxxx) con el valor que va.. ;)
Tambien le agregue la funcion para terminar de ejecutar el script...

Código: Seleccionar todo

HotKeySet("{Esc}", "_exit")
HotKeySet("4", "_RC")
While 1
Wend
Func _exit()
	Exit
EndFunc
Func _RC()
		send("{SPACE}")
 		sleep(100)
		send("1")
 		sleep(100)
		send("{SPACE}")
EndFunc
EDIT: Lo acabo de probar y dentro del juego no me deja mandar space, el script anda, pero el juego debe estar protegido porque no registra que le mandan la tecla SPACE..

Re: Crear una Macro en el teclado

Publicado: 12 Abr 2011, 08:53
por Ximorro
@Hate
Pues sí deberías mirarte un poco la ayuda, para aprender al principio es más rápido que preguntar cada cosita. Si no no avanzaremos.
Por ejemplo...
Send es una función para mandar pulsaciones del teclado al programa activo. Así que Send Opt("SendKeyDelay", 1.000) no tiene ningún sentido, Opt es una función y se invoca sin el Send.

El punto se usa en los números para separar parte entera de parte decimal, (por ejemplo 1.5) así que 1.000 es igual a 1. Con lo que Opt("SendKeyDelay", 1.000) sólo para un milisegundo y Opt("SendKeyDelay", 20.000) sólo 20 milisegundos.
Tienes que ponerlos sin el punto:
Opt("SendKeyDelay", 20000) ; 20 segundos entre pulsación y pulsación (lo que es una barbaridad, seguramente no querrás usar tanto)

Las llaves en Send se usan para casos especiales, Send("1") es como presionar el número 1 en el teclado, así que ahí no hacen falta llaves.
Send({SPACE}1{SPACE}) NO es un segundo entre espacio y espacio, es presionar espacio, después tecla "1", después espacio.

Venga ánimo que con AutoIt se pueden hacer muchísimas cosas, ¡pero hay que mirarse un poquito la ayuda! :smt005

@ms999
Para no cargar la CPU es mejor poner un delay dentro del bucle:

Código: Seleccionar todo

While 1
    Sleep(2000) ;incluso se puede poner un más, los hotkey interrumpen sin problema.
Wend
Con un bucle sin sleep la CPU está continuamente ejecutándolo, que aunque no tenga nada dentro puedes comprobar en un administrador de tareas cómo sube la carga (al menos en un núcleo) probablemente cerca del 100%. Sleep manda el proceso a dormir, ("sleep" es "dormir" en inglés) con lo que deja de ejecutarse en ese tiempo y la CPU usa 0% en él.
Los Hotkey ya interrumpen el sleep() así que podemos mandar a dormir tranquilamente el proceso que nos despertará cuando toque ;-)

Re: Crear una Macro en el teclado

Publicado: 12 Abr 2011, 09:48
por Ximorro
Hate, he creado una entrada con una guía de cómo adentrarse desde el principio en esto de Autoit:
http://www.emesn.com/autoitforum/viewto ... f=2&t=2593

Espero que te sea útil.

Re: Crear una Macro en el teclado

Publicado: 12 Abr 2011, 09:56
por Hate.
ms999 escribió:¿Sos RuidosoCajcabel?
Sí , y gracias por tu ayuda
Ximorro escribió:Send({SPACE}1{SPACE}) no es un segundo entre espacio y espacio, es presionar espacio, después tecla "1", después espacio.
( lo habia entendido dije 1 segundo entre tecla y tecla porq tenia el Opt("SendKeyDelay", 1000).
Gracias por la guía, la estoy leyendo.

Re: Crear una Macro en el teclado

Publicado: 13 Abr 2011, 03:28
por ms999
Ximorro escribió:@Hate
@ms999
Para no cargar la CPU es mejor poner un delay dentro del bucle:

Código: Seleccionar todo

While 1
    Sleep(2000) ;incluso se puede poner un más, los hotkey interrumpen sin problema.
Wend
Con un bucle sin sleep la CPU está continuamente ejecutándolo, que aunque no tenga nada dentro puedes comprobar en un administrador de tareas cómo sube la carga (al menos en un núcleo) probablemente cerca del 100%. Sleep manda el proceso a dormir, ("sleep" es "dormir" en inglés) con lo que deja de ejecutarse en ese tiempo y la CPU usa 0% en él.
Los Hotkey ya interrumpen el sleep() así que podemos mandar a dormir tranquilamente el proceso que nos despertará cuando toque ;-)
Lo estube mirando y tenes razon.... pero es raro porque sin sleep, el uso del CPU varía entre 29% y 50% pero con sleep(2000) me pone 0%.... ahora lo raro.. probe poner sleep(1) y tambien me pone 0%, quiza el tiempo de refresco no alcanza a mostrarme el cambio..

Re: Crear una Macro en el teclado

Publicado: 13 Abr 2011, 08:19
por Ximorro
A mí sin Sleep se me clava en 50%, en este ordenador de dos núcleos significa que tengo uno al 100%
Ojo que la gráfica del administrador de tareas que muestra la carga en cada núcleo es mentira, me pone uno al 75% y otro al 25%, pero el proceso está sólo en un núcleo, ya lo había notado en un quad core en un programa de renderizado en el que puedes asignar los núcleos a usar, y si pongo tres sí tengo el global al 75% de uso (3 núcleos al 100% y uno al 0%), pero en las grafiquitas parece que estén usándose todos bastante... ¡FALSO!

Tienes razón, también me sorprende lo poco que afecta un Sleep(1), en este ordenador más viejo sí me sube a un simple 5% que tampoco es mucho, pero es más que nada. Parece que 1ms es mucho para los ordenadores actuales (vaya, con 3GHz por ejemplo son 3 millones de ciclos por milisegundo, así que puede hacer muchas cosas ;-) ). Pero vaya, ante la posibilidad de que se ejecute el programa en ordenadores más lentos para asegurarte ponle más.

En este programa en concreto como si pones Sleep(2147483647) (es el máximo: 24 horas) :smt003 Los HotKey lo interrumpen así que no hay ningún problema. :smt005

Re: Crear una Macro en el teclado

Publicado: 13 Abr 2011, 16:38
por ms999
Aprovecho y te lo pregunto aca.... yo antes para registrar un evento de teclado usaba algo como if _ispressed("blabla") pero este si que no funciona cuando el script esta en sleep... la pregunta sería ¿como puedo anular los hotkeys antes de entrar a un bucle y reanudarlos en otro bucle?

Re: Crear una Macro en el teclado

Publicado: 14 Abr 2011, 08:30
por Ximorro
Pues hay que hacerlo "a mano", es decir, las tienes que anular poniendo a esa combinación de teclas un hotkey sin función:
HotKeySet("{Esc}")
HotKeySet("4")


Y cuando quieras volver a activarlas le vuelves a poner la función.
HotKeySet("{Esc}", "_exit")
HotKeySet("4", "_RC")


Ojo que no hay que poner estas cosas dentro de los bucles, sino antes de ellos.

Si lo haces varias veces o acaban siendo muchos hotkey puede que sea más cómodo agruparlo en un par de funciones tipo _ActivaHotKeys(), DesactivaHotKeys()

Re: Crear una Macro en el teclado

Publicado: 14 Abr 2011, 14:08
por ms999
Lo de ponerlos en funciones ya me habia empezado a acostumbrar a hacerlo asi... gracias Ximorro.. lo ultimo que te preguntaría sobre el tema(ya lo pedi prestado bastante).

Yo se que las hotkeys funcionan aunque el programa esté fuera de foco, lo probé con una calculadora, la de alastor para ser mas preciso, pero estas no me funcionan cuando estoy dentro de un juego en cambio _ispressed si me funciona dentro del juego, habra una manera "sencilla" de hacer que las hotkeys me funcionen dentro del juego... sino es sencilla no te gastes, que tampoco es tan importante esto.

Re: Crear una Macro en el teclado

Publicado: 15 Abr 2011, 08:27
por Ximorro
Exactamente no puedo saber lo que pasa pero tengo una sospecha:
Hay juegos que no les gusta que les hagan bots, de hecho algunos lo prohíben explícitamente.

Así que no es raro encontrarse con medidas anti-bot, por ejemplo que las funciones tipo PixelGetColor o PixelSearch devuelvan siempre color negro. No me extrañaría que estén capturando el mecanismo de hotkey, consumen ellos la tecla y no pasan en mensaje a Windows. _IsPressed igual funciona porque no usa ese mecanismo de enganche al teclado, sino que estás explorando el teclado activamente...

Re: Crear una Macro en el teclado

Publicado: 18 Abr 2011, 18:15
por ms999
Bueno lo que no funcionaba era que usaba hotkeyset() para activarlo ahora uso _ispressed() dentro de un bucle
y te quedaría asi

Código: Seleccionar todo

AutoItSetOption("SendKeyDownDelay", 15) ; con este delay anda perfecto, le da tiempo al programa para registrar el evento de teclado sino no lo registra..
;...tu GUI
While 1
       select
           case _ispressed(34)
                _RC()
       Endselect
       sleep(100)
Wend
Func _RC()
	Send(" ", 1)
	Send("3")
	Send(" ", 1)
EndFunc   ;==>_RC

Re: Crear una Macro en el teclado

Publicado: 18 Abr 2011, 22:16
por ms999
mira que lindo me quedo ^^

Imagen

Re: Crear una Macro en el teclado

Publicado: 19 Abr 2011, 08:53
por Ximorro
Enhorabuena por solucionarlo.

Por afinar te puedo decir que el código se puede compactar bastante:
El select, si no vas a poner más condiciones, queda mucho más compactado con un IF simple:
If _ispressed("34") Then _RC()

Así, en una línea, sin EndIf.

Sobre _IsPressed:
Según la ayuda _IsPressed recibe una cadena, así que es mejor ponerle las comillas al 34 porque de lo contrario tiene que pasar tu número a cadena. Si ya le pones el tipo que espera no tiene que hacer conversiones y será un poco más rápido.

Esta sí es importante: te recomiendo que para agilizar mucho los _IsPressed le pases en el segundo parámetro el handler de la dll, porque de lo contrario cada vez que la invocas tiene que conectarla.
Para ello abres tú la dll antes del bucle con:
$user32_dll = DllOpen("user32.dll")
La llamada queda
_IsPressed("34", $user32_dll)
Fuera del bucle cierras la dll:
DllClose($user32_dll)
Así es bastante más rápido.

Y para finalizar, los 3 Send los puedes poner en uno:
Send(" 3 ")
El segundo parámetro no hace falta si no tienes caracteres especiales que marcan nombres de tecla, como {ESC} y cosas así, al poner un 1 en el segundo parámetro ahí presionará las teclas "{", "E", "S", etc, en vez de la tecla Escape. En tu caso no hace falta pues no usas teclas especiales.

Como queda en una línea puedes evitar la función, con lo que el código queda más simple. Si crees que en un futuro vas a hacer la función más compleja, o la vas a usar desde varios sitios, déjala, pero si se va a quedar así de una línea puedes poner el Send dentro del bucle y ya está.

Que conste que no digo todo esto para fastidiar, que quede claro que EL CÓDIGO ESTABA BIEN. Lo digo para que veas cómo se puede mejorar pues simplemente son cosas que se ven mucho y optimizan el código, principalmente lo de pasar la dll a _IsPressed (muy importante cuando se usa así en bucles rápidos), o lo de poner los Send en uno, veo muchas veces que se hace una llamada a Send para cada tecla, cuando las puedes poner todas juntas.
Las otras cosas pueden ser cuestión de gusto.

Saludossss

Re: Crear una Macro en el teclado

Publicado: 19 Abr 2011, 18:24
por ms999
No fastidias para nada... eso ayuda, voy a hacer lo de la dll para el _ispressed y pondre closedll() antes del exit :)
pfff el codigo lo desarrolle bastante mas, con una GUI y unos radio checks!! luego lo subo a ver si me das algun consejo para ahorrar codigo porque por ahora tengo 251 lineas :smt024 jeje quiza sea algo desordenado para escribir aunque me parece que todas las lineas son funcionales... le agregue otro pequeño bot... y algunas otras opciones.... cuando lo tenga listo lo subo...

Para hacer la GUi use las api que vienen ya desarrolladas(justo venia buscando esto, para desarrollar algunas funciones yo mismo aver si aprendia) y quedo bastante bien...
como te dije.. lo voy a subir cuando este completo :)

gracias de a miles!

EDIT: Estoy seguro de que cuando veas el code vas a caer de culo viendo la cantidad de code que uso... ademas creo que nunca le mostre a alguien con mucha mas experiencia que yo mis codes, va a estar bueno si me podes corregir en algunas cosas... ^^