Es ese precisamente jaja sisi. Cliente sin sonido. Y si, te tenes que registrar
ahora voy a probar el programa que me dijiste recien..
Pues que quiere que te diga no me pienso registrar
En cuanto al
AutoHotKey, error mío, no sirve. Según he leído "
Los scripts de AutoHotkey se pueden utilizar para iniciar programas, abrir documentos, enviar pulsaciones de teclas y enviar clics y movimientos del ratón"
He mirado por ahí tutoriales y no veo como enviar las pulsaciones, solo crear acceso rápido a tareas mediante teclado.
Pues nada prueba esto. Es un ejemplo. Para usar con la calculadora de windows y el Notepad.
Hay varias maneras de enviar mensajes a una ventana, prueba esta a ver si te sirve con ese juego.
- Crea
dos botones y añade el siguiente código:
para VB6Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" _
(ByVal Hwnd As Long, _
ByVal wFlag As Long) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _
(ByVal Hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Const VK_NUMPAD1 = &H61
Const WM_KEYUP = &H101
Const WM_KEYDOWN = &H100
Const NILL = 0&
Const WM_SYSCOMMAND = &H112
Const SC_CLOSE = &HF060
Const GW_HWNDNEXT = 2
Const GW_CHILD = 5
Private Sub Form_Load()
Shell ("Notepad")
Shell ("Calc")
End Sub
Private Sub Command1_Click()
Dim Hwnd As Long
'Windows Vista/XP
Hwnd = FindWindow("SciCalc", vbNullString)
'Windows 7
'Hwnd = FindWindow("CalcFrame", vbNullString)
Me.Caption = Hwnd
'//Envia la pulsación de la tecla 2 (del teclado alfabético)
Call PostMessage(Hwnd, WM_KEYDOWN And WM_KEYUP , vbKey2, NILL)
End Sub
Private Sub Command2_Click()
Dim Hwnd As Long
Dim HwndChild As Long
Hwnd = FindWindow("Notepad", vbNullString)
Me.Caption = Hwnd
HwndChild = GetNextWindow(Hwnd, GW_CHILD)
'//Envia la pulsación de la tecla 2 (del teclado alfabético)
Call PostMessage(HwndChild, WM_KEYDOWN And WM_KEYUP, vbKeyQ, NILL)
End Sub
EXPLICACIÓN:
FindWindow obtiene un número que es el identificador de ventana (handle). La mayoría de los procesos de windows tienen su handle. La barra de tareas de windows por ejemplo también tiene su handle.
Sin embargo algunas ventanas tienen ventanas "hijas", como es el caso del
Notepad, donde la ventana hija es el cuadro de texto donde se escribe. Por esta razón en el segundo botón he puesto
GetNextWindow, para obtener la ventana "hija" y enviar el mensaje de pulsación a esta ventana. Podría ser que este juego tenga una ventana hijo.
SciCalc/CalcFrame, Notepad. Son nombres de clase (ClassName). Necesarios para obtener el
Handle o Identificador de ventana. También es posible el nombre de la ventana, por ejemplo "Sin títuo - Bloc de notas" o "Calculadora"
Hwnd = FindWindow(vbNullString, "Calculadora")
Hwnd = FindWindow(vbNullString, "Sin título - Bloc de notas")
O ambos, útil para mismo proceso con idénticos nombres de clase pero con distinto nombre de ventana.
Hwnd = FindWindow("SciCalc", "Calculadora")
Hwnd = FindWindow("Notepad", "Sin título - Bloc de notas")
Para obtener el "Class Name" puedes usar la herramienta
Spy++ incluída en VB6 o VB.NET. Al que puedes acceder desde el menú inicio de windows. Pulsa buscar ventana y arrastra la diana hasta la ventana que quieras identificar y Spy++ te mostrará el nombre de clase y el identificador (en hexadecimal).
He metido
Me.Caption = Hwnd para que se vea el identificador, si es 0, es que no has obtenido ningún identificador. Porque has escrito mal el nombre de clase o el de la ventana.
Para VB.NETImports System.Runtime.InteropServices
Imports System.Security
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'//Abre el notepad y la calculadora
Process.Start("Notepad")
Process.Start("Calc")
Button1.Text = "2 a Calculadora"
Button2.Text = "Q a Notepad"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'//Obtiene el identificador de la ventana de la Calculadora
'Windows Vista/XP
Dim Hwnd As IntPtr = NativeMethods.FindWindow("SciCalc", Nothing)
'Windows 7
'Dim Hwnd As IntPtr = NativeMethods.FindWindow("CalcFrame", Nothing)
Me.Text = Hwnd
'//Envia la pulsación de la tecla 2 (del teclado alfabético)
NativeMethods.PostMessage(Hwnd, NativeMethods.WM_KEYDOWN And NativeMethods.WM_KEYUP, Keys.D2, NativeMethods.NILL)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'//Obtiene el identificador de la ventana del Notepad
Dim Hwnd As IntPtr = NativeMethods.FindWindow("Notepad", Nothing)
'//Obtiene el identificador de la ventana "hijo" del Notepad (ClassName="Edit")
Dim hwndChild As IntPtr = NativeMethods.GetNextWindow(Hwnd, NativeMethods.GW_CHILD)
Me.Text = Hwnd
'//Envia la pulsación de la tecla 'Q'
NativeMethods.PostMessage(hwndChild,NativeMethods.WM_KEYDOWN And NativeMethods.WM_KEYUP , Keys.Q, NativeMethods.NILL)
End Sub
End Class
<SuppressUnmanagedCodeSecurity()>
Friend NotInheritable Class NativeMethods
Private Sub New()
End Sub
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Friend Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto, EntryPoint:="GetWindow")> _
Friend Shared Function GetNextWindow(ByVal hwnd As IntPtr, ByVal wFlag As Integer) As Integer
End Function
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Friend Shared Function FindWindowEx(ByVal hWnd1 As IntPtr, _
ByVal hWnd2 As IntPtr, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Integer
End Function
<DllImport("user32.dll", CharSet:=CharSet.Auto, Entrypoint:="PostMessageA")> _
Friend Shared Function PostMessage(ByVal hwnd As IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As Integer) As Integer
End Function
Public Const VK_NUMPAD1 = &H61
Public Const WM_KEYUP = &H101
Public Const WM_KEYDOWN = &H100
Public Const NILL = 0&
Public Const WM_SYSCOMMAND = &H112
Public Const SC_CLOSE = &HF060
Public Const GW_HWNDNEXT = 2
Public Const GW_CHILD = 5
End Class
La idea es que obtengas el nombre de clase de la ventana del juego y pruebes desde el programa pulsando el botón a ver envía la pulsación. Si funciona pues en lugar del botón puedes usar un Timer, para que envíe una pulsación cada X segundos de forma automática.