Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: z_ane_666 en 17 Noviembre 2010, 02:44 AM

Título: mantener presionada tecla-api de windows
Publicado por: z_ane_666 en 17 Noviembre 2010, 02:44 AM
hola , estoy haciendo u programa para sacar especiales de videojuegos y este es mi codigo

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
        Const VK_forw = &H27
        Const VK_back = &H25
        Const VK_down = &H28
        Const VK_a = &H41
        Const KEYEVENTF_KEYUP = &H2
       
       
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
keybd_event VK_forw, 0, 0, 0
keybd_event VK_forw, 0, KEYEVENTF_KEYUP, 0
Sleep 100
keybd_event VK_back, 0, 0, 0
keybd_event VK_back, 0, KEYEVENTF_KEYUP, 0
Sleep 100
keybd_event VK_forw, 0, 0, 0
keybd_event VK_forw, 0, KEYEVENTF_KEYUP, 0
Sleep 100
keybd_event VK_down, 0, 0, 0
keybd_event VK_down, 0, KEYEVENTF_KEYUP, 0
Sleep 100
keybd_event VK_a, 0, 0, 0
keybd_event VK_a, 0, KEYEVENTF_KEYUP, 0
Timer1.Enabled = False

End Sub


al probar este codigo en un archivo de texto, funciona correctamente, pero al probarlo estando activo el juego no funciona

El problema que veo es que las teclas con esta api se presiona muy rapido, y es por eso que no reacciona el personaje

lo que quisiera saber es si se puede adaptar de tal manera que la tecla este presionada por al menos 1800 ms y que luego se suelte con KEYEVENTF_KEYUP

saludos

NOTA: probe con un bucle, funciona muy bien en archivos de texto, pero no en el juego
Título: Re: mantener presionada tecla-api de windows
Publicado por: NightMore en 17 Noviembre 2010, 02:54 AM
Si necesitas que mantenga una tecla apretada es simple en un timer pones el intervalo adentro del timer pones esto Sendkeys "Letra"
Título: Re: mantener presionada tecla-api de windows
Publicado por: z_ane_666 en 17 Noviembre 2010, 03:28 AM
Cita de: NightMore en 17 Noviembre 2010, 02:54 AM
Si necesitas que mantenga una tecla apretada es simple en un timer pones el intervalo adentro del timer pones esto Sendkeys "Letra"

Pero eso solamente es una funcion exclusiva de visual basic , yo quiero hacerlo con API por que es general para todo el sistema
Título: Re: mantener presionada tecla-api de windows
Publicado por: BlackZeroX en 17 Noviembre 2010, 04:43 AM
.
Cita de: NightMore en 17 Noviembre 2010, 02:54 AM
Si necesitas que mantenga una tecla apretada es simple en un timer pones el intervalo adentro del timer pones esto Sendkeys "Letra"

Existe un segundo parametro en Senkeys que le indica en MILISEGUNDOS el retardo... Sendkeys 

Código (vb) [Seleccionar]


Sub SendKeys(String As String, [Wait])
    Miembro de VBA.Interaction
    Envía pulsaciones de teclas a la ventana activa



Dicho paremetro es Opcional...

Cita de:  link=topic=310913.msg1543529#msg1543529 date=1289960891
Pero eso solamente es una funcion exclusiva de visual basic , yo quiero hacerlo con API por que es general para todo el sistema

SenKeys trabaja digamos que igual que el api solo que api es mas moldeable y SendKeys solo limita a la ventana activa ese es un problema en especial cuando se le quieren enviar las pulsaciones a una ventana oculta ( llamase Hwnd )

Con esto puede hacer el retardo:

Código (Vb) [Seleccionar]


'
'   /////////////////////////////////////////////////////////////
'   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
'   //                                                         //
'   // Web:     http://InfrAngeluX.Sytes.Net/                  //
'   //                                                         //
'   //    |-> Pueden Distribuir Este codigo siempre y cuando   //
'   // no se eliminen los creditos originales de este codigo   //
'   // No importando que sea modificado/editado o engrandecido //
'   // o achicado, si es en base a este codigo                 //
'   /////////////////////////////////////////////////////////////
'   // http://infrangelux.sytes.net/Blog/index.php?option=com_content&view=article&id=6:artwait&catid=2:catprocmanager&Itemid=8
'   /////////////////////////////////////////////////////////////

Option Explicit

Private Declare Function WaitMessage Lib "user32" () As Long

Enum eTime
    Horas = 3600
    Minutos = 60
    Segundos = 1
End Enum

Public Sub Wait(ByVal vToWait&, Optional ByVal ThisWait As eTime = Segundos, Optional ByVal UseAllProc As Boolean = False)
Dim vDateE      As Date
    vDateE = DateAdd("s", vToWait& * (ThisWait + 0), Time)
    Do While vDateE > Time
        Call WaitMessage
        If Not UseAllProc Then DoEvents
    Loop
End Sub

Título: Re: mantener presionada tecla-api de windows
Publicado por: raul338 en 17 Noviembre 2010, 15:14 PM
Código (vb) [Seleccionar]

Sleep 100
keybd_event VK_a, 0, 0, 0
Sleep 50
keybd_event VK_a, 0, KEYEVENTF_KEYUP, 0

Probaste eso? o prueba mas intervalos :P ya que como dices que presiona muy rapido, puedes agregarle "tiempo" :xD
Título: Re: mantener presionada tecla-api de windows
Publicado por: z_ane_666 en 18 Noviembre 2010, 03:29 AM
muchas gracias BlackZeroX por tu codigo, ahoira tratare de adaptarlo

raul, ya habia probado lo que me pusiste y no funciona, pero igual hare de nuevo el intento con doevents, quiza algo pase XD

saludos
Título: Re: mantener presionada tecla-api de windows
Publicado por: BlackZeroX en 18 Noviembre 2010, 04:57 AM
.
Sleep()

Te va a dormir el hilo actual de tu programa es decir te va a parar cualquier proceso, mientras que mi funcion Wait(), solo te va a "Dormir" el proceso actual mas no el hilo.

Dulces Lunas!¡.