• Miércoles 15 de Mayo de 2024, 14:14

Autor Tema:  Simular Pulsaciones De Teclas...  (Leído 2419 veces)

culd

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Simular Pulsaciones De Teclas...
« en: Miércoles 14 de Marzo de 2007, 17:06 »
0
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
  1. Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  2.  

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
  1.  Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  2.  
  3. Private Sub Timer1_Timer()
  4. If GetKeyState(vbKeyRight) < 0 And GetKeyState(vbKeyShift) >= 0 Then
  5.     LDerecha.Caption = "si"
  6. Else
  7.     LDerecha.Caption = "no"
  8. End If
  9.  
  10. If GetKeyState(vbKeyUp) < 0 Then
  11.     LArriba.Caption = "si"
  12. Else
  13.     LArriba.Caption = "no"
  14. End If
  15.  
  16. If GetKeyState(vbKeyDown) < 0 Then
  17.     LAbajo.Caption = "si"
  18. Else
  19.     LAbajo.Caption = "no"
  20. End If
  21.  
  22. If GetKeyState(vbKeyLeft) < 0 And GetKeyState(vbKeyShift) >= 0 Then
  23.     LIzquierda.Caption = "si"
  24. Else
  25.     LIzquierda.Caption = "no"
  26. End If
  27. End Sub
  28.  

albertovicat

  • Miembro activo
  • **
  • Mensajes: 38
    • Ver Perfil
Re: Simular Pulsaciones De Teclas...
« Respuesta #1 en: Sábado 17 de Marzo de 2007, 11:36 »
0
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

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: Simular Pulsaciones De Teclas...
« Respuesta #2 en: Sábado 17 de Marzo de 2007, 16:39 »
0
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.
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.