[AYUDA] Simular pulsaciones de teclado

  • Hola Invitado ¿Quieres conversar con todos los usuarios de GamerzHacking?, No esperes mas y entra al canal de Discord dando clic AQUI
  • Hola Invitado, hemos decidido no subir mas videos de Game Hacking a la mierda de YouTube, mas informacion AQUI. Nuestro nuevo canal de videos ahora es COCOSCOPE.
  • Hola Invitado ¿Quieres formar parte del Staff de GamerzHacking?, No esperes mas y entra al siguiente enlace AQUI
  • Hola Invitado ¿Eres programador y quieres pertenercer GamerzHacking?, No esperes mas y entra a postular aqui AQUI
30 dAmerica/Bogota Octubre dAmerica/Bogota 2018
5
0
1
43
#1
Buenas,

Estoy intentado hacer un bot para el juego lineage 2, mas por diversión que por otra cosa..

El programa que estoy haciendo quiero que sea bastante sencillo. (programado con C#)

Si el HP baja mas de la mitad que tome una poción pulsando F1 o 1 (que hace los mismo en el juego).

El nivel la barra de HP la controlo capturando la pantalla y mirando la parte de la imagen donde esta la barra de HP y si cambia de rojo a negro.

La parte de comprar imágenes la tengo realizada, pero no logro mandar a la ventana del juego una simulación de que se ha pulsado la tecla F1

Que he hecho hasta ahora:
He usado Sky ++ para sacar el nombre la ventana del juego. Solo me daba una valor en la ventana. Ya apuntara al marco del la ventana del juego a al mapa o a la zona de chat del juego. Esto no creo que sea el fallo, ya que cuando mando el foco al juego y se maximiza puedo pulsar F1 y se toma una poción. Pero no logro mandar el F1 desde el codigo del programa

Sin contar la parte del comparación de imágenes el código y la parte de los using es el siguiente:


C#:
  [DllImport("user32.dll")]

        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);



        [DllImport("user32.dll", CharSet = CharSet.Unicode)]

        public static extern bool SetForegroundWindow(IntPtr hWnd);

      

       //por ahora quiero hacer que al pulsar un botón se tome una poción, luego ya lo automatizare con un timer por ejemplo.   

        private void button1_Click(object sender, EventArgs e)

        {

             IntPtr handle;



            string className = "L2UnrealWWindowsViewportWindow";



            //Localizo al identificador de la ventana del lineage2

            handle = FindWindow(className, null);



            //Le paso el foco al juego

            SetForegroundWindow(handle);

            Thread.Sleep(1000);



            //Formas en las que he intentado mandar la pulsación del F1 pero no ha funcionado ninguna

            //Forma 1

            //SendKeys.Send("{F1}");

            //Forma 2

            //[DllImport("user32.dll")]

            //private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int dwExtraInfo);

            //keybd_event(VK_F1, 0, 0, 0);

            //Thread.Sleep(100);

            //keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);

            //Forma 3

            //keybd_event((byte)Keys.F1, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);

            //Thread.Sleep(200);

            //keybd_event((byte)Keys.F1, 0, 2, 0);

            //Forma4

            //InputSimulator sim = new InputSimulator();

            //sim.Keyboard.KeyPress(VirtualKeyCode.VK_1);

         }
No se que puedo estar haciendo mal, pero aunque se maximiza el juego ya no hace nada. ( las distintas formas que he usado para hacer la simulcion de pulsacion las he hecho una a una y son los //).

El foco le llega bien al juego y si pulso manualmente las teclas funciona.

Alguien sabe que puedo estar haciendo mal? o donde puedo ver algún ejemplo que me sirva para avanzar?

Muchas gracias.
 
Última modificación por un moderador:
30 dAmerica/Bogota Octubre dAmerica/Bogota 2018
5
0
1
43
#3
Gracias por el aporte.

Pero tampoco funciona.

Process p = Process.GetProcessesByName("L2.bin").FirstOrDefault();
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("1");

¿Puede tener algo que ver que el proceso esa un .bin en vez de una .exe?

Hasta el SetForegroundWindow funciona bien. Pero luego no me manda la pulsación de teclado.

Puede tener el juego algo que bloquee este tipo de instrucciones?

Porque si pongo notepad en vez de L2.bin manda bien la pulsación de teclado.

pd: También lo he intentado con el AutoItX y pasa lo mismo. Al notepad puedo pasar las pulsaciones de teclado pero el L2 no las acepta.
 
Última modificación:
1 dAmerica/Bogota Noviembre dAmerica/Bogota 2015
1.103
197
63
28
Lima
gamerzhacking.com
#4
Gracias por el aporte.

Pero tampoco funciona.

Process p = Process.GetProcessesByName("L2.bin").FirstOrDefault();
IntPtr h = p.MainWindowHandle;
SetForegroundWindow(h);
SendKeys.SendWait("1");

¿Puede tener algo que ver que el proceso esa un .bin en vez de una .exe?

Hasta el SetForegroundWindow funciona bien. Pero luego no me manda la pulsación de teclado.

Puede tener el juego algo que bloquee este tipo de instrucciones?

pq si pongo notepad en vez de L2.bin manda bien la pulsación de teclado.
Puede que si, solo debes de investigar un poco mas. Aquí algo de información que puede ser útil para lo que estas tratando de realizar.

  • SendKeys.Send() - es un Windows Forms envoltorio para la función API de Windows SendInput(). Esta función funciona directamente con el flujo de entrada del mouse y el teclado. Aunque hay algunas limitaciones (por favor, lea la documentación para esto).
  • SendMessage() - es una función de WinAPI. Se usa para enviar un mensaje específico a una ventana (s). Se puede usar para enviar otros mensajes además de la entrada del mouse o del teclado. Esta es una especie de cola de mensajes de nivel superior donde muchos otros mensajes se agregan y se envían a la (s) ventana (s). También existen limitaciones para ordenar mensajes entre procesos.
  • Detectabilidad: esto dependerá realmente de qué tan bien puede imitar el proceso de presionar un botón y de cuán bueno es el motor contra el engaño al que se enfrenta. Cuando un humano presiona un botón, se envían pocos mensajes a la ventana. Además de WM_KEYDOWN, hay WM_KEYUP y algunos otros. Su tarea es recrear esa secuencia lo más cerca posible. Tendrá que hacer su propia investigación sobre este tema. Ya puede ver que el ser humano, presionando un botón, no puede crear una situación donde solo WM_KEYDOWN se envía a la ventana, WM_KEYUP debe hacer un seguimiento. También el retraso entre los dos debe ser humanamente posible y así sucesivamente .
También creo, SendMessage() puede no funcionar como se espera con los juegos, ya que muchos de ellos utilizan DirectX DirectInput y en este caso el La función WinAPI SendInput(), creo, puede hacer un mejor trabajo ya que es una API de nivel inferior y funciona directamente con la corriente de entrada.

Saludos
 
30 dAmerica/Bogota Octubre dAmerica/Bogota 2018
5
0
1
43
#5
Buenos días,

después de mucho mirar mucho por internet, y no avanzar con nada, encontré un programa que me pareció una maravilla

El AutoHotKey

y mas concretamente una aplicación hecha en su foro con la que se analizaban 6 o 7 formas distintas de pasar pulsaciones de tecla o click a un juego

El link a esa aplicación, es el siguiente:

Send and Click Tool V4.1 - Gaming Scripts - AutoHotkey Community

Como soy bastante nuevo en esto de trampear juegos y no logro mandar pulsaciones de tecla directamente al juego, he pensado en usar el programa como "Bypass".

Con AutoHotKey se puede hacer un apaño, se puede mirar en memoria que punteros usa y cambiar los valores de un par de variables desde C para así pasar pulsaciones de forma indirecta a cualquier juego.

Estoy simplificando el script para hacer que tenga dos variables, una sera la tecla que quiero pasar el juego y otra una condición que su es true manda la pulsación. De tal manera que el programa queda ejecutado en memoria todo el rato con un bucle. Y cuando quiera mandar una pulsación al juego, cambio las dos variables. La de ejecutar a 1 y la variable que es la tecla en si. El bucle leerá un if. cuando ejecutar es 1 mandar la tecla al programa y vuelve a poner ejecutar a 0.

espero que se entienda la solución que le voy a dar al problema con el que inicie este hilo.

Como ya he dicho acabo de empezar y seguro que existen formas mas sencillas de hacerlo, pero yo las desconozco ;(

Un saludo.
 
1 dAmerica/Bogota Noviembre dAmerica/Bogota 2015
1.103
197
63
28
Lima
gamerzhacking.com
#6
Buenos días,

después de mucho mirar mucho por internet, y no avanzar con nada, encontré un programa que me pareció una maravilla

El AutoHotKey

y mas concretamente una aplicación hecha en su foro con la que se analizaban 6 o 7 formas distintas de pasar pulsaciones de tecla o click a un juego

El link a esa aplicación, es el siguiente:

Send and Click Tool V4.1 - Gaming Scripts - AutoHotkey Community

Como soy bastante nuevo en esto de trampear juegos y no logro mandar pulsaciones de tecla directamente al juego, he pensado en usar el programa como "Bypass".

Con AutoHotKey se puede hacer un apaño, se puede mirar en memoria que punteros usa y cambiar los valores de un par de variables desde C para así pasar pulsaciones de forma indirecta a cualquier juego.

Estoy simplificando el script para hacer que tenga dos variables, una sera la tecla que quiero pasar el juego y otra una condición que su es true manda la pulsación. De tal manera que el programa queda ejecutado en memoria todo el rato con un bucle. Y cuando quiera mandar una pulsación al juego, cambio las dos variables. La de ejecutar a 1 y la variable que es la tecla en si. El bucle leerá un if. cuando ejecutar es 1 mandar la tecla al programa y vuelve a poner ejecutar a 0.

espero que se entienda la solución que le voy a dar al problema con el que inicie este hilo.

Como ya he dicho acabo de empezar y seguro que existen formas mas sencillas de hacerlo, pero yo las desconozco ;(

Un saludo.
Tambien tiene auto it y otros que hace uff no recuerdo, algo de imaxmacro creo.

Saludos.
 

Archivo adjunto