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)
Código VB.NET:
Ver originalImports 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.