(AYUDA) Crear un ¿auto-tip?

Iniciado por nhydawn, 16 Julio 2016, 16:34 PM

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

nhydawn

Wooo wooo eso es exactamente lo que necesito, que poteé mientras yo juego, agradezco muchisimo tu ayuda, ahora una pregunta, que deberia modificar para que funcione? El juego en el adm de tareas aparece como Main.exe y las teclas a tipearse son Q y W (o solamente Q si es mas sencillo así). Otra duda, cuando dices GUI te refieres a una ventanita con botones y demas? Seria demasiado pedir que me lo programes ya funcionando?  ;D porque lo que acabo de leer es chino basico para mi  :o pero de verdad en caso que no quieras agradezco mucho tu ayuda, ahora voy a buscar una guia de VB.NET a ver si lo puedo hacer yo pero lo veo dificil  :-\

Eleкtro

Cita de: ASOUKU en 18 Julio 2016, 13:41 PMque deberia modificar para que funcione? El juego en el adm de tareas aparece como Main.exe y las teclas a tipearse son Q y W (o solamente Q si es mas sencillo así).

Citar
Código (vbnet) [Seleccionar]
success = (Keyboard.SendKey(Keys.F1, KeyBehavior.Press) = 2)

Solo tienes que cambiar la tecla "F1" por la que desees, y añadir más instrucciones debajo de esa linea en caso de que quieras enviar más pulsaciones adicionales (Q -> W -> etc...)




Cita de: ASOUKU en 18 Julio 2016, 13:41 PM
cuando dices GUI te refieres a una ventanita con botones y demas?

Si.




Cita de: ASOUKU en 18 Julio 2016, 13:41 PMSeria demasiado pedir que me lo programes ya funcionando?

Si, lo siento pero es demasiado pedir. Una cosa es que te ayudemos en poca o gran medida, y otra cosa que te lo hagamos todo, aunque practicamente ya te lo di todo hecho, solo tienes que adaptar el código que te ofrecí.




Cita de: ASOUKU en 18 Julio 2016, 13:41 PMlo que acabo de leer es chino basico para mi  :o

Supongo que tienes nociones de VB6, entonces no te sería demasiado dificil aprender VB.NET, tampoco tienes que aprender nada avanzado para adaptar ese código (bueno, a menos que quieras profundizar en la programación asincrónica).

Saludos!








nhydawn

Perfecto  ;D voy a intentar hacerlo y les comento como me fue  :silbar:

Lekim

#13
Hola

No dices para que tipo de juego, de ventana, Internet, pantalla completa. Los de Mame32 no dejan. Lo digo por si quieres que dispare constantemente. Para enviar en mensaje sólo a ese juego yo primero obtendría el handle de la ventana y enviaría el mensaje de pulsación de tecla a esa ventana.

Pero esto lo he hecho con juegos que tienen algún tipo de identificador para poder enviar el mensaje. Nunca lo he hecho por ejemplo con juegos de internet. En este caso no se si sería enviarlo a la ventana de navegador.

Si lo quieres para VB6 si quieres te lo pongo, pero puedes encontrar un porrón de ejemplos en Internet.

s2s

nhydawn

Lekim, el juego es Mu 99c una version viejita ya, yo lo ejecuto en modo ventana pero tambien tiene pantalla completa, emm me podrias ayudar a programar el auto-pot? Yo lo intente pero no me funciona :(

Lekim

#15
Cita de: ASOUKU en 21 Julio 2016, 17:30 PM
Lekim, el juego es Mu 99c una version viejita ya, yo lo ejecuto en modo ventana pero tambien tiene pantalla completa, emm me podrias ayudar a programar el auto-pot? Yo lo intente pero no me funciona :(

¿Es este?
http://mupirata.com.ar/99c/index.php

Me lo estoy descargando desde mega, ¿Es Cliente99cConSonido.exe?

Más que nada es para probar porque cada juego es un mundo. Así, no hay que hacer 30 posts

Imagino que es para PC ¿Es online?

Espero no tener que registrarme ni nada de eso  :¬¬



Nunca he usado pero he visto en foros que hay programas ya echos para esto como uno llamado AutoHotkey
Que envía pulsaciones de teclas de forma automática.

No lo he probado pero podrías probar, a lo mejor te sirve.

http://ahkscript.org/

nhydawn

Es ese precisamente jaja sisi. Cliente sin sonido. Y si, te tenes que registrar  :xD ahora voy a probar el programa que me dijiste recien..

Lekim

#17
Cita de: ASOUKU en 22 Julio 2016, 18:43 PM
Es ese precisamente jaja sisi. Cliente sin sonido. Y si, te tenes que registrar  :xD 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 VB6

Código (vb) [Seleccionar]
Private 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.NET

Código (vbnet) [Seleccionar]

Imports 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.

nhydawn

No me vas a ayudar porque no te quieres registrar?  :¬¬

Lekim

#19
Cita de: ASOUKU en 23 Julio 2016, 16:24 PM
No me vas a ayudar porque no te quieres registrar?  :¬¬

XD, parece que has contestado mientras modificaba mi último post. A ver si te sirve el ejemplo.

S2s



me he liado un poco editandolo, mira otra vez