Programación General > Visual Basic 6.0 e inferiores

 Simular Pulsaciones De Teclas...

(1/1)

culd:
Hola que tal, estoy realizando simulaciones de pulsaciones de teclas del teclado. Y encontré un gran problema a la hora de enviar pulsaciones a ciertos programas.

Si el programa al que se le desea enviar alguna pulsación de tecla con SendKeys, utiliza la función:


--- Código: Text ---Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer 
Todas las teclas que se envíen con SendKeys, el programa en cuestión no las detecta.

Quisiera saber cómo se puede solucionar esto, ya que me está haciendo doler la cabeza.

Dejo un código de un proyecto, el cual detecta mediante GetKeyState la pulsación de los direccionales del teclado (que es lo que me interesa simular).
Solamente hay que poner 4 labels y un TIMER (intervalo 10). Los labels se llaman:
LArriba
LAbajo
LIzquierda
LDerecha

La idea es lograr mediante otro programa, enviar una simulación de las teclas direccionales del teclado, y que el proyecto detecte la pulsación y marque como “SI” se pulso.


--- Código: Text --- Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Private Sub Timer1_Timer()If GetKeyState(vbKeyRight) < 0 And GetKeyState(vbKeyShift) >= 0 Then    LDerecha.Caption = "si"Else    LDerecha.Caption = "no"End If If GetKeyState(vbKeyUp) < 0 Then    LArriba.Caption = "si"Else    LArriba.Caption = "no"End If If GetKeyState(vbKeyDown) < 0 Then    LAbajo.Caption = "si"Else    LAbajo.Caption = "no"End If If GetKeyState(vbKeyLeft) < 0 And GetKeyState(vbKeyShift) >= 0 Then    LIzquierda.Caption = "si"Else    LIzquierda.Caption = "no"End IfEnd Sub 

albertovicat:
Para que el valor enviado mediante SendKeys haga efecto, es necesario que en el programa destino el control que tiene el foco sea el adecuado. En tu caso necesitas que al enviar la pulsación de "flecha arriba" el control enfocado en el programa destino sea LArriba, e igual para los demás casos.
Creo que el destinatario debe estar recibiendo las pulsaciones, pero seguramente el control que tiene el foco es otro y por eso no hace lo que esperas de él.

culd:

--- Cita de: "albertovicat" --- Para que el valor enviado mediante SendKeys haga efecto, es necesario que en el programa destino el control que tiene el foco sea el adecuado. En tu caso necesitas que al enviar la pulsación de "flecha arriba" el control enfocado en el programa destino sea LArriba, e igual para los demás casos.
Creo que el destinatario debe estar recibiendo las pulsaciones, pero seguramente el control que tiene el foco es otro y por eso no hace lo que esperas de él.
--- Fin de la cita ---
Gracias, pero ya lo habia solucionado...

No hay forma que utilizando SendKeys el getkeystate lo detecte... Ya lo recontra probe...

Igualmente encontre una api...

Public Declare Sub keybd_event Lib "User32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwflags As Long, ByVal dwExtraInfo As Long)

Public Const KEYEVENTF_EXTENDEDKEY = &H1
Public Const KEYEVENTF_KEYUP = &H2

Se utiliza asi:

Call keybd_event(X, 0, 0, 0) ' aprieta el boton
Sleep 10
Call keybd_event(X, 0, KEYEVENTF_KEYUP, 0) 'suelta el boton

(donde x es el numero hexadecimal del boton que se quiere apretar)..

Tambien hay que poner un sleep entre que se aprieta y se suelta, ya que si no se espera un pequeño intervalo, directamente no lo nota el getkeystate.

Navegación

[0] Índice de Mensajes

Ir a la versión completa