mantener presionada tecla-api de windows

Iniciado por z_ane_666, 17 Noviembre 2010, 02:44 AM

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

z_ane_666

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

NightMore

Si necesitas que mantenga una tecla apretada es simple en un timer pones el intervalo adentro del timer pones esto Sendkeys "Letra"
No uses la programacion contra el mal no cometas pecados,con programacion.Usa la programacion con sabiduria y dios te dara una mano.

Que dios los vendiga a todos

z_ane_666

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

BlackZeroX

.
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

The Dark Shadow is my passion.

raul338

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

z_ane_666

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

BlackZeroX

.
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!¡.
The Dark Shadow is my passion.