Generar Pulsacion !

Iniciado por ElChispa, 4 Noviembre 2010, 19:51 PM

0 Miembros y 1 Visitante están viendo este tema.

ElChispa

Hola !, Es mi primer Post y Necesito Generar una Pulsación Por Ejemplo La "Barra espaciadora" Q es la tecla (32), Ya probé con Sendkey Pero necesito estar en Foco de esa aplicación .. y q lo mande a esa aplicación con Key_Event No la manda por q La aplicación funciona con Direct x , Leei este post http://foro.elhacker.net/programacion_vb/obtener_color-t243976.0.html  y Dice

"El único problema que he tenido es que SendKeys no funciona en juegos a pantalla completa. Así que busqué un poco por el foro y descubrí que con la librería AutoItX3 se puede enviar usando directamente el Direct X. Lo probé y funciona perfectamente."
(VB)

seele


ElChispa

JAJAJA perdón , La pregunta es : como Simular una pulsación en una aplicación de Direct X? como hizo Spider-Net Para generarla..? :huh:

Desde ya muchas gracias..

seele

mmmm la verdad nunca tuve la necesidad de hacer lo que pides, no por el momento...
pero estuve buscando un poco de info y quizas esto te pueda dar una idea

http://www.gamedev.net/community/forums/topic.asp?topic_id=419710

saludos

Novlucker

"El único problema que he tenido es que SendKeys no funciona en juegos a pantalla completa. Así que busqué un poco por el foro y descubrí que con la librería AutoItX3 se puede enviar usando directamente el Direct X. Lo probé y funciona perfectamente."

:http://www.autoitscript.com/autoit3/index.shtml
:http://www.autoitscript.com/autoit3/docs/appendix/SendKeys.htm

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

[D4N93R]


ElChispa

Disculpen por mi ignorancia pero no entiendo Como hacerlo todavia solo uso VB o VB.NET Otro Lenguaje nose =/, Vi esto de una web si me pueden dar una mano ..
Gracias por todo

Un tema difícil de verdad. Pero ya encontré una solución. Bien un poco de teoría primero.

Lo que intentaba hacer era enviar pulsaciones de teclado a un juego.
¿Cuál es el problema? El problema consiste, por lo que pude averiguar, que los juegos como este que trabajan bajo DirectX tiene su propio nivel de pulsaciones de teclado y desde el método SendKeys.send() no se puede enviar a este tipo de aplicaciones, (esto no es del todo cierto ya que funciona cuando se envía el siguiente código: SendKeys.Send("{ENTER}")).

Lo siguiente es una suposición mia, por favor no lo tomen como referencia y es sobre el "{ENTER}", creo yo que en el código del evento o de la clase SendKeys, el comando "{ENTER}" está programado a bajo nivel, ya sea porque está codificado con su valor hexadecimal y no ASCII o ya sea porque para este caso en especial quisieron que el enter fuera a cualquier aplicación. Saqué esta conclusión debido a un programa en C donde se usaba SendInput y el enter lo enviaban en hexadecimal y el resto de las teclas en su correspondiente valor ASCII o sea en byte. Como les he dicho, NO TOMEN ESTA CONCLUSIÓN COMO REFERENCIA, realmente no conozco como funciona internamente el envío de pulsaciones de teclas del framework de .NET y puedo estar totalmente equivocado, si alguien sabe el porque del funcionamiento del "{ENTER}" y no del resto de las teclas les agradecería la información.

Encontré información que habla sobre importar la librería Microsoft.DirectX.DirectInput que se encarga de trabajar con el teclado, ratón joystic, etc... para DirectX, pero el problema es que no conseguí información de cómo enviar una pulsación de tecla, (bueno, encontré algo, pero haciendo honor a la verdad, no entendí nada, ni siquiera estoy seguro de que realmente se envíe la tecla).
Así que desistí del tema del uso de directX, por ahora claro, y fuí por otro camino.

Buscando en interner conseguí está aplicación AutoIt v3 que sirve para crear macros, lo que me llamó la atención al leer la documentación, es que se podía usar la librería en los proyectos .NET y es gratuito.

Instalé la aplicación, hice referencia a la librería en mi proyecto y luego probé el método para enviar la pulsación al juego, el resultado es que funciona perfecto.

Ahora lo divertido:
La aplicación se llama AutoIt v3 - San Google se los encontrará en un 2 x 3.
La librería se llama AutoItX3Lib.dll. Importar la librería al proyecto: imports AutoItX3Lib
Instanciamos: Dim au As New AutoItX3Lib.AutoItX3
Uso del envío de pulsaciones: au.Send("t up",0) o también au.Send("t down",0)
[code]Imports AutoItX3Lib
 
Public Class Form1
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        sTimer(TextBox2, TextBox1)
    End Sub
 
    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        sTimer(TextBox4, TextBox3)
    End Sub
 
    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        sTimer(TextBox6, TextBox5)
    End Sub
 
    Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
        sTimer(TextBox8, TextBox7)
    End Sub
 
    Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick
        sTimer(TextBox10, TextBox9)
    End Sub
 
    Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick
        sTimer(TextBox12, TextBox11)
    End Sub
 
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Timer1.Enabled = True
        Timer2.Enabled = True
        Timer3.Enabled = True
        Timer4.Enabled = True
        Timer5.Enabled = True
        Timer6.Enabled = True
    End Sub
 
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        Timer1.Enabled = False
        Timer2.Enabled = False
        Timer3.Enabled = False
        Timer4.Enabled = False
        Timer5.Enabled = False
        Timer6.Enabled = False
    End Sub
 
    Private Sub sTimer(ByVal txt As TextBox, ByVal txtEnvio As TextBox)
        On Error Resume Next
        'Se comprueba que exista texto en la caja correspondiente y que su valor sea mayor que 0...
        If Not (txt.Text = "") And IsNumeric(txt.Text) Then
            If CLng(txt.Text) > 0 Then
                txt.Text = CStr(CLng(txt.Text) - 1)
            End If
        Else
            Exit Sub
        End If
 
        Dim time_t As Integer
        time_t = CInt(txt.Text)             'Se transforma el valor de la caja de texto al tipo integer...
 
        If CInt(txt.Text) = 0 Then
            txt.Text = time_t.ToString()    'El valor del time_t se pasa a string y se le asigna a la caja de texto...
        End If
 
        Dim tiempomuerto As Integer
        tiempomuerto = 0
 
        If CInt(txt.Text) = tiempomuerto Then   'Si el valor es igual a 1 entonces...
            Dim au As New AutoItX3Lib.AutoItX3  'Librería encargada de enviar las pulsaciones del teclado...
 
            au.Send(txtEnvio.Text + " down", 0) 'Con esta línea simulamos que estamos presionando la tecla..
            'au.Send(txtEnvio.Text + " up", 0)   'Con esta línea simulamos que estamos soltando la tecla presionada...
        End If
    End Sub
End Class



au.Send(txtEnvio.text + " down") simula que se está presionando sobre la tecla. Es impor tante colocar ya sea el "down" o el "up", si no, no va a funcionar.

Y por último, esta librería también permite activar la ventana, minimizar, cerrar, abrir aplicaciones, etc...
Todo lo que una librería para macros debería hacer, solo hay que investigarla un poco y hacer MUCHAS PRUEBAS .

Un cordial saludo a todos y que lo disfruten.[/code]

Novlucker

A ver si no queda claro, dices que programas en VB y VB.NET, ese code que dejas esta en VB, así que solucionado no?

Sino directamente con Autoit, que te he dejado los links antes, así como la referencia a las funciones que tienes que usar.

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

ElChispa

Sii Disculpame pero me olvide de decirte q Nose como importar esa Libreria.. EN VB.Net  para q funcione ..

Novlucker

Instala Autoit, son 8Mb ;D

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein