Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/03/2010, 23:08
Avatar de xdrtas
xdrtas
 
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 15 años, 9 meses
Puntos: 13
Respuesta: Simular teclado VB.Net

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:
  1. La aplicación se llama AutoIt v3 - San Google se los encontrará en un 2 x 3.
  2. La librería se llama AutoItX3Lib.dll. Importar la librería al proyecto: imports AutoItX3Lib
  3. Instanciamos: Dim au As New AutoItX3Lib.AutoItX3
  4. Uso del envío de pulsaciones: au.Send("t up",0) o también au.Send("t down",0)

Código VB.NET:
Ver original
  1. Imports AutoItX3Lib
  2.  
  3. Public Class Form1
  4.     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  5.         sTimer(TextBox2, TextBox1)
  6.     End Sub
  7.  
  8.     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
  9.         sTimer(TextBox4, TextBox3)
  10.     End Sub
  11.  
  12.     Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
  13.         sTimer(TextBox6, TextBox5)
  14.     End Sub
  15.  
  16.     Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
  17.         sTimer(TextBox8, TextBox7)
  18.     End Sub
  19.  
  20.     Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick
  21.         sTimer(TextBox10, TextBox9)
  22.     End Sub
  23.  
  24.     Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick
  25.         sTimer(TextBox12, TextBox11)
  26.     End Sub
  27.  
  28.     Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
  29.         Timer1.Enabled = True
  30.         Timer2.Enabled = True
  31.         Timer3.Enabled = True
  32.         Timer4.Enabled = True
  33.         Timer5.Enabled = True
  34.         Timer6.Enabled = True
  35.     End Sub
  36.  
  37.     Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
  38.         Timer1.Enabled = False
  39.         Timer2.Enabled = False
  40.         Timer3.Enabled = False
  41.         Timer4.Enabled = False
  42.         Timer5.Enabled = False
  43.         Timer6.Enabled = False
  44.     End Sub
  45.  
  46.     Private Sub sTimer(ByVal txt As TextBox, ByVal txtEnvio As TextBox)
  47.         On Error Resume Next
  48.         'Se comprueba que exista texto en la caja correspondiente y que su valor sea mayor que 0...
  49.         If Not (txt.Text = "") And IsNumeric(txt.Text) Then
  50.             If CLng(txt.Text) > 0 Then
  51.                 txt.Text = CStr(CLng(txt.Text) - 1)
  52.             End If
  53.         Else
  54.             Exit Sub
  55.         End If
  56.  
  57.         Dim time_t As Integer
  58.         time_t = CInt(txt.Text)             'Se transforma el valor de la caja de texto al tipo integer...
  59.  
  60.         If CInt(txt.Text) = 0 Then
  61.             txt.Text = time_t.ToString()    'El valor del time_t se pasa a string y se le asigna a la caja de texto...
  62.         End If
  63.  
  64.         Dim tiempomuerto As Integer
  65.         tiempomuerto = 0
  66.  
  67.         If CInt(txt.Text) = tiempomuerto Then   'Si el valor es igual a 1 entonces...
  68.             Dim au As New AutoItX3Lib.AutoItX3  'Librería encargada de enviar las pulsaciones del teclado...
  69.  
  70.             au.Send(txtEnvio.Text + " down", 0) 'Con esta línea simulamos que estamos presionando la tecla..
  71.             'au.Send(txtEnvio.Text + " up", 0)   'Con esta línea simulamos que estamos soltando la tecla presionada...
  72.         End If
  73.     End Sub
  74. 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.
__________________
¿Cuál es el mejor lenguaje para programar?
Aquel lenguaje por el cual te paguen más.
[--::xdrtas.coolpage.biz::--]
[---:::xdrtas:::---]