Comprobar el estado del teclado

La función TerminalInfoInteger permite conocer el estado de las teclas de control, también llamadas virtuales. Se trata, en concreto, de Ctrl, Alt, Shift, Enter, Ins, Del, Esc, flechas, etc. Se llaman virtuales porque los teclados, por regla general, ofrecen varias formas de generar la misma acción de control. Por ejemplo, Ctrl, Shift y Alt se duplican a la izquierda y a la derecha de la barra espaciadora, mientras que el cursor puede desplazarse tanto por las teclas dedicadas como por las principales cuando se pulsa Fn. Por lo tanto, esta función no puede distinguir entre métodos de control a nivel físico (por ejemplo, Shift izquierdo y derecho).

La API define constantes para las siguientes claves:

Identificador

Descripción

TERMINAL_KEYSTATE_LEFT

Flecha izquierda

TERMINAL_KEYSTATE_UP

Flecha arriba

TERMINAL_KEYSTATE_RIGHT

Flecha derecha

TERMINAL_KEYSTATE_DOWN

Flecha abajo

TERMINAL_KEYSTATE_SHIFT

Mayús

TERMINAL_KEYSTATE_CONTROL

Ctrl

TERMINAL_KEYSTATE_MENU

Windows

TERMINAL_KEYSTATE_CAPSLOCK

BloqMayús

TERMINAL_KEYSTATE_NUMLOCK

BloqNum

TERMINAL_KEYSTATE_SCRLOCK

BloqDespl

TERMINAL_KEYSTATE_ENTER

Intro

TERMINAL_KEYSTATE_INSERT

Insert

TERMINAL_KEYSTATE_DELETE

Supr

TERMINAL_KEYSTATE_HOME

Inicio

TERMINAL_KEYSTATE_END

Fin

TERMINAL_KEYSTATE_TAB

Tab

TERMINAL_KEYSTATE_PAGEUP

Repág

TERMINAL_KEYSTATE_PAGEDOWN

Avpág

TERMINAL_KEYSTATE_ESCAPE

Esc

La función devuelve un valor entero de dos bytes que informa del estado actual de la clave solicitada mediante un par de bits.

El bit menos significativo lleva la cuenta de las pulsaciones desde la última llamada a una función. Por ejemplo, si TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE) devolvió 0 en algún momento, y luego el usuario pulsó Escape, entonces en la siguiente llamada, TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE) devolverá 1. Si se vuelve a pulsar la tecla, el valor volverá a ser 0.

Para las teclas encargadas de conmutar los modos de entrada, como CapsLock, NumLock y crollLock, la posición del bit indica si el modo correspondiente está activado o desactivado.

El bit más significativo del segundo byte (0x8000) se activa si la tecla está pulsada (y no soltada) en ese momento.

Esta función no puede utilizarse para realizar un seguimiento de la pulsación de teclas alfanuméricas y funcionales. Para ello, es necesario aplicar el manejador OnChartEvent e interceptar los mensajes con el código CHARTEVENT_KEYDOWN en el programa. Tenga en cuenta que los eventos se generan en el gráfico y sólo están disponibles para los Asesores Expertos y los indicadores. Los programas de otros tipos (scripts y servicios) no admiten el modelo de programación de eventos.

El script EnvKeys.mq5 incluye un bucle a través de todas las constantes TERMINAL_KEYSTATE.

void OnStart()
{
   for(ENUM_TERMINAL_INFO_INTEGER i = TERMINAL_KEYSTATE_TAB;
      i <= TERMINAL_KEYSTATE_SCRLOCK; ++i)
   {
      const string e = EnumToString(i);
      // skip values that are not enum elements
      if(StringFind(e"ENUM_TERMINAL_INFO_INTEGER") == 0continue;
      PrintFormat("%s=%4X"e, (ushort)TerminalInfoInteger(i));
   }
}

Puede experimentar con las pulsaciones y activar o desactivar los modos de teclado para ver cómo cambian los valores en el registro.

Por ejemplo, si las mayúsculas están desactivadas por defecto, veremos el siguiente registro:

TERMINAL_KEYSTATE_SCRLOCK= 0

Si pulsamos la tecla ScrollLock y, sin soltarla, volvemos a ejecutar el script, obtenemos el siguiente registro:

TERMINAL_KEYSTATE_CAPSLOCK=8001

Es decir, el modo ya está activado y la tecla, pulsada. Vamos a soltar la tecla, y la próxima vez el script volverá:

TERMINAL_KEYSTATE_SCRLOCK= 1

El modo ha permanecido activado, pero la tecla se soltó.

TerminalInfoInteger no es adecuado para comprobar el estado de las teclas (TERMINAL_KEYSTATE_XYZ) en los indicadores dependientes creados por la llamada iCustom o IndicatorCreate. En ellos, la función siempre devuelve 0, incluso si el indicador se añadió al gráfico utilizando ChartIndicatorAdd.

Además, la función no funciona cuando el gráfico del programa MQL no está activo (el usuario ha cambiado a otro). MQL5 no proporciona medios para el control permanente del teclado.