ERROR: Instrucción SendKeys varios desactiva la tecla BLOQ NUM

Síntomas

Ejecución de al menos dos instrucciones de EnviarTeclas en una fila como resultado si desactiva la tecla BLOQ NUM. Este problema puede afectar también a las teclas BLOQ MAYÚS y Bloq Despl.

Causa

Este problema se trata con un anidamiento de captura el estado del teclado. La primera instrucción SendKeys toma una instantánea del estado de teclado y desactiva todos los alterna. La segunda instrucción SendKeys se ejecuta antes de la primera de ellas había jugado todas las claves y restaura el estado del teclado. Por lo tanto, el estado del teclado se grabe de nuevo por la segunda EnviarTeclas, esta vez con todo permite alternar todavía apagado. Finalmente, el estado del teclado se restaura al estado posterior (desactiva).

Solución

Para evitar este problema, siga uno de estos procedimientos:

  • Enviar todos los caracteres en una sola instrucción SendKeys. - o -


  • Ejecutar una función DoEvents entre cada instrucción SendKeys. Sin embargo, según la complejidad de las pulsaciones de tecla, esto podría no funcionar en todos los casos. - o -


  • Determinar el valor de la tecla BLOQ NUM antes de utilizar SendKeys. A continuación, desactivar la tecla Bloq Núm antes de utilizar SendKeys. Después de utilizar SendKeys, restablecer el BLOQ NUM en su configuración anterior. Esto se consigue mediante las funciones GetKeyboardState, keybd_event y API SetKeyboardState. Consulte la sección REFERENCIAS a continuación para obtener más información. - o -


  • Utilizar funciones de la API en lugar de SendKeys. Consulte la sección REFERENCIAS a continuación para obtener más información,

Estado

Microsoft ha confirmado que se trata de un error de los productos de Microsoft enumerados al principio de este artículo. Se está investigando este error y se publicará nueva información aquí, en Microsoft Knowledge Base, cuando esté disponible.

Más información

Pasos para reproducir el comportamiento

  1. Inicie un nuevo proyecto EXE estándar en Visual Basic. Se creará Form1 de forma predeterminada.
  2. Agregue un CommandButton a Form1.
  3. Copie el código siguiente en la ventana código de Form1:
          Option Explicit

    Private Sub Command1_Click()
    SendKeys "a"
    SendKeys "b"
    End Sub

  4. En el menú Ejecutar, haga clic en Inicio o presione la tecla F5 para iniciar el programa. Si la luz de BLOQ NUM está desactivado, active la tecla Bloq Núm luz presionando la tecla BLOQ NUM. Haga clic en el CommandButton y observe que se apaga la luz de BLOQ NUM.
  5. Cierre Visual Basic y repita los pasos anteriores; Este tiempo a agregar DoEvents, como sigue:

          Private Sub Command1_Click()         SendKeys "a"
    DoEvents
    SendKeys "b"
    End Sub

    NOTE: You should restart Visual Basic before trying the DoEvents
    solution. Otherwise, the keyboard state may be set incorrectly,

    impide que cualquier intento de solución correcta.

Referencias

"Guía del programador de Visual Basic 5.0 a la API Win32," por Dan Appleman capítulo 6: Hardware y funciones del sistema


Para obtener información adicional, consulte el artículo siguiente en Microsoft Knowledge Base:
177674 HOWTO: alternar el BLOQ NUM y BLOQ DESPL teclas de BLOQUEO
Propiedades

Id. de artículo: 179987 - Última revisión: 01/09/2017 - Revisión: 1

Comentarios