Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Simular pulsacion de tecla, y que GetKeyState la detecte

Estas en el tema de Simular pulsacion de tecla, y que GetKeyState la detecte en el foro de Visual Basic clásico en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 14/03/2007, 10:04
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Simular pulsacion de tecla, y que GetKeyState la detecte

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:
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:
 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 If
End Sub
  #2 (permalink)  
Antiguo 14/03/2007, 10:46
 
Fecha de Ingreso: enero-2007
Ubicación: Tingo María - Perú
Mensajes: 399
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Esta es la form en que yo envio pulsaciones y en cuanto a GetKeyState si lo detecta no se si es la misma manera en la que estas enviando las pulsaciones

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2
Const VK_LWIN = &H5B

Private Sub Command1_Click()
Call keybd_event(38, 0, 0, 0)
Call keybd_event(38, 0, KEYEVENTF_KEYUP, 0)
'Call keybd_event(VK_LWIN, 0, 0, 0)
'Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)

End Sub
  #3 (permalink)  
Antiguo 14/03/2007, 11:46
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Cita:
Iniciado por boluart Ver Mensaje
Esta es la form en que yo envio pulsaciones y en cuanto a GetKeyState si lo detecta no se si es la misma manera en la que estas enviando las pulsaciones

Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const KEYEVENTF_KEYUP = &H2
Const VK_LWIN = &H5B

Private Sub Command1_Click()
Call keybd_event(38, 0, 0, 0)
Call keybd_event(38, 0, KEYEVENTF_KEYUP, 0)
'Call keybd_event(VK_LWIN, 0, 0, 0)
'Call keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0)

End Sub

Funciona perfectamente...

Ahora te hago un par de preguntas:
Si utilizo
Call keybd_event(38, 0, KEYEVENTF_KEYUP, 0)
o directamente
Call keybd_event(38, 0, 0, 0)

El getkeystate lo detecta correctamente.

Pero sigue pulsado... Es decir no deja de pulsar.

Como puedo hacer para que deje de pulsar?

Última edición por culd; 14/03/2007 a las 12:08 Razón: Edito por que me exprese mal
  #4 (permalink)  
Antiguo 14/03/2007, 15:49
 
Fecha de Ingreso: enero-2007
Ubicación: Tingo María - Perú
Mensajes: 399
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Realmente tienen que ser ambos ya que el primero le envia el evento KeyDown (Cuando presiona la tecla) y la segunda e KeyUp (Cuando es soltada la tecla) asi que para que funcione correctamente tienes que enviar ambos eventos

Call keybd_event(38, 0, 0, 0) 'KeyDown
Call keybd_event(38, 0, KEYEVENTF_KEYUP, 0) ' KeyUp
  #5 (permalink)  
Antiguo 14/03/2007, 17:36
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Cita:
Iniciado por boluart Ver Mensaje
Realmente tienen que ser ambos ya que el primero le envia el evento KeyDown (Cuando presiona la tecla) y la segunda e KeyUp (Cuando es soltada la tecla) asi que para que funcione correctamente tienes que enviar ambos eventos

Call keybd_event(38, 0, 0, 0) 'KeyDown
Call keybd_event(38, 0, KEYEVENTF_KEYUP, 0) ' KeyUp
Note lo siguiente...

Eso que decis es verdad, pero si mandas el numero de acsii no sirve, hay que mandar directamente en hexadecimal... para que funcione... y hay que darle un tiempo entre que aprieta y entre que suelta...

Utilice un Sleep para que retenga el boton pulsado y luego pulse...

En un rato, edito y pongo un listado de hexadecimales de las teclas mas usadas
  #6 (permalink)  
Antiguo 14/03/2007, 17:46
 
Fecha de Ingreso: enero-2007
Ubicación: Tingo María - Perú
Mensajes: 399
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Que puedo decir??? ... solo que aprendes rápido.

Y tambien quiera hacerte una consulta, me parece o estas haciendo algo asi como el Teclado en pantalla del XP (osk.exe)
  #7 (permalink)  
Antiguo 15/03/2007, 10:13
Avatar de culd  
Fecha de Ingreso: noviembre-2003
Mensajes: 959
Antigüedad: 20 años, 6 meses
Puntos: 19
Re: Simular pulsacion de tecla, y que GetKeyState la detecte

Cita:
Iniciado por boluart Ver Mensaje
Que puedo decir??? ... solo que aprendes rápido.

Y tambien quiera hacerte una consulta, me parece o estas haciendo algo asi como el Teclado en pantalla del XP (osk.exe)
Si, en realidad que cuando se pulse una tecla "anule" esa tecla, y pulse otra en realidad...

Con respecto a la tabla de hexadecimales...
http://ascii.cl/es/
Ahi hay un listado largo lago...

Igualmente intente utilizar la funcion "HEX", para que con el numero Acsii (si no conozco el numero acsii utilido "ASC") me devuelva directamente el hexadecimal.
Pero.... Devuelve un String, y no sirve para este tipo de control que recive Byte.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 08:10.