Hola hola gente, voy a ir directo al grano, esto intentado crear/programar un auto-tip (nombre que se me ocurrio porque no tengo idea de como se llama/llamaria) la idea es crear un programita sencillo que al presionar F8 se inicia y comienza a auto-tipear las letras Q y W de formar rapida y repetida hasta que se presiona F9 para detener el programa, estuve viendo tutoriales de autoclicks porque supuse que es bastante similar, pero no puedo lograrlo, ¿es posible que me ayuden? Creo que seria un codigo bastante sencillo ;D pero la verdad no tengo idea de programación :xD espero que puedan ayudarme, saludos :rolleyes:
Holas, sino sabes programar no podemos guiarte en tu trabajo, ya que no vas a poder seguir ningun consejo ni idea, te facilito un enlace pero deberias buscar en google.
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/24.htm
Y por aca algo de este foro que esta bastante bien por lo que vi.
https://foro.elhacker.net/programacion_vb/pulsando_teclas_con_visual_basic-t257211.0.html
Con este ejemplo podes detectar el codigo de la tecla, despues con un SendKeys podrias presionarla con la ref obtenida:
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/24.htm
Algo me dice que no va a ser facil :P
Digamos, si me guio con una guia de la programación de un auto-click (es que de esto si encontre en youtube) y de alguna forma milagrosa lo modifico para que cumpla la misma funcion pero en vez de clickear, que tipee Q y W. ¿Seria posible? ¿o los codigos cambian totalmente? :-\
Googleando un poco me tope con esto:
http://foro.elhacker.net/hacking_avanzado/pulsador_tecla_automatico-t354968.0.html
Pide lo mismo que yo, intente descargarlo para modificarlo con la tecla "Q" al menos, peeeeeeeero.. obviamente el link está caido, ¿alguien me daria una mano y me crea uno para que yo pueda modificarlo y aprender desde ahi? ;D les estaria agradecido de por vida ;-)
¿Nadie? :silbar: al menos una miniguia para hacerlo :silbar: porfa :rolleyes:
El caso es que las pulsaciones automáticas dan muchos problemas.
Ver la tecla pulsada es facil, pero pulsar una tecla en otro programa no suele serlo.
Esto sería la base de tu programa:
Puedes probarlo en un nuevo proyecto con 2 timer y un textbox (que puse para las pruebas).
Después de probarlo anula la línea que pone "Text1.SetFocus" y pruebalo, pero no te va a mandar teclas a otros programas.
Busca por ahí los diferentes modos de enviar pulsaciones que encuentres a ver si te van mejor que SendKeys y nos cuentas.
Option Explicit
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Const constKeyDown = -32767
Private Sub Form_Load()
'INTERVALO DE PULSACIONES
Timer2.Enabled = False
Timer2.Interval = 50
'INTERVALO DE COMPROBACION DE TECLAS
Timer1.Interval = 50
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Dim F8 As Integer
Dim F9 As Integer
' COMPROBAMOS LAS TECLAS
F8 = GetAsyncKeyState(vbKeyF8)
F9 = GetAsyncKeyState(vbKeyF9)
'SI SE HAN PULSADO HACEMOS LO QUE TOQUE
If F8 <= constKeyDown Then
'ENFOCAMOS AL TEXTBOX PARA QUE SE PULSEN AHI LAS TECLAS
Text1.SetFocus
' Y ACTIVAMOS EL TIMER
Timer2.Enabled = True
End If
If F9 <= constKeyDown Then
'DESACTIVAMOS EL TIMER
Timer2.Enabled = False
End If
End Sub
Private Sub Timer2_Timer()
'PUEDEN PULSARSE LAS 2 TECLAS A CADA VUELTA:
'SendKeys "QW"
' O CADA CICLO UNA TECLA:
' VARIABLE QUE NO SE BORRA AL SALIR DE LA SUB
Static Ultimaletra As String
' SEGUN LA ULTIMA PULSACION ELEGIMOS LA TECLA A PULSAR
If Ultimaletra = "Q" Then
SendKeys "W"
Ultimaletra = "W"
Else
SendKeys "Q"
Ultimaletra = "Q"
End If
End Sub
Saludos
Cita de: ASOUKU en 16 Julio 2016, 16:34 PMauto-tip (nombre que se me ocurrio porque no tengo idea de como se llama/llamaria)
Para que puedas darle un nombre mejor, te digo que en todo caso más bien seria "auto-type", por que un "tip" es algo muy distinto que nada tiene que ver.
Veo que has buscado como hacer esto en otros lenguajes (por aquél post que has compartido), así que te pregunto: ¿realmente necesitas hacerlo en VB6?. Si el lenguaje te es indiferente entonces puedo mostrarte una manera facilisima e intuitiva utilizando mi librería gratuita
ElektroKit, mediante VB.NET o C#.
También deberías aclarar si simplemente pretendes enviar pulsaciones del teclado sin más, o más bien pretendes adjuntar texto a la ventana de edición de un programa de terceros. Son dos cosas muy distintas con sus respectivas técnicas.
Saludos
Muchas gracias por las respuestas, pkj gracias por el codigo, voy a intentar hacerlo funcionar ;D
Elektro, no no para nada, cualquier lenguaje que me ayude a lograr lo que necesito me vendria bien, la idea es que las pulsaciones se envien a un juego, lo que estoy pidiendo en este post para no andar con rodeos es un "auto-pot" (pot=pociones) si no es mucha molestia, estaria buenisimo que me ayudes a programarlo como vos decis ;D
Cita de: ASOUKU en 18 Julio 2016, 07:26 AM
Muchas gracias por las respuestas, pkj gracias por el codigo, voy a intentar hacerlo funcionar ;D
Elektro, no no para nada, cualquier lenguaje que me ayude a lograr lo que necesito me vendria bien, la idea es que las pulsaciones se envien a un juego, lo que estoy pidiendo en este post para no andar con rodeos es un "auto-pot" (pot=pociones) si no es mucha molestia, estaria buenisimo que me ayudes a programarlo como vos decis ;D
Entonces, si no he entendido mal, ¿quieres que mientras tú estás jugando al juego (es decir, mientras la ventana del juego está activa), cada "X" tiempo se pulse la tecla para tomar una poción?.
En ese caso lo podrías hacer de la siguiente manera:
1. Descarga la librería
ElektroKit:
- ElektroKit Framework v1.8 | ( Complementos para el núcleo de .Net Framework ) (http://foro.elhacker.net/net/elektrokit_framework_v18_complementos_para_el_nucleo_de_net_framework-t444997.0.html)
2. Utiliza un código parecido a este:
Imports System.Threading
Imports System.Threading.Thread
Imports System.Windows.Forms
Imports Elektro.Core.IO.Enums
Imports Elektro.Core.IO.Tools
Public Module Module1
Public Sub Main()
Console.Title = "Auto-Potion"
Console.WriteLine("Press any key to start...")
Console.ReadKey(intercept:=True)
Module1.RunBot()
End Sub
<DebuggerStepperBoundary>
Private Sub RunBot()
' Añadir tareas aquí.
Dim potionAction As Action = Sub() Module1.TakePotion(TimeSpan.FromSeconds(3))
Dim potionTask As New Task(potionAction)
' Iniciar tareas aquí (asincrónicamente).
Console.Clear()
Console.WriteLine("Bot is running...")
potionTask.Start()
' Esperar sincrónicamente a que todas las tareas asincrónicas finalicen.
Task.WaitAll({potionTask})
End Sub
<DebuggerStepThrough>
Private Sub TakePotion(ByVal interval As TimeSpan)
Dim success As Boolean
Do While True
Sleep(interval)
success = (Keyboard.SendKey(Keys.F1, KeyBehavior.Press) = 2)
If (success) Then
Console.WriteLine("[{0}] Potion consumed.", DateTime.Now.ToLongTimeString())
Else
Environment.ExitCode = 1
Environment.FailFast(String.Format("Not all keystrokes were sent in Method: '{0}()'.", New StackFrame(0).GetMethod.Name))
End If
Loop
End Sub
End Module
Saludos
Hay un BUG en el foro que no me permite publicar el código de forma deseada ni modificar el post correctamente, así que lo siento, pero hago este doble post.
>>>
Con la misma librería puedes identificar "X" ventana si lo llegas a necesitar (para darle el foco o lo que quieras), y también puedes registrar teclas de acceo rápido (o system-wide hotkeys) para pausar el bot en cualquier momento, pero eso ya sería conveniente hacerlo en una GUI por el paradigma de eventos, lo que te he mostrado es una aplicación CLI escrita en VB.NET.
Saludos
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 :-\
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í).
Citarsuccess = (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!
Perfecto ;D voy a intentar hacerlo y les comento como me fue :silbar:
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
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 :(
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 (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 (https://es.wikipedia.org/wiki/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/ (http://ahkscript.org/)
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..
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 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.NET
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.
No me vas a ayudar porque no te quieres registrar? :¬¬
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