Проверка состояния клавиатуры

Функция TerminalInfoInteger позволяет узнать состояние управляющих клавиш, называемых также виртуальными. К их числу относятся, в частности, Ctrl, Alt, Shift, Enter, Ins, Del, Esc, стрелки для движения курсора и так далее. Виртуальными они называются потому, что на клавиатурах, как правило, имеется несколько способов сгенерировать одно и то же управляющее действие. Например, Ctrl, Shift, Alt дублируются слева и справа от пробела, а движение курсором может выполняться как выделенными клавишами, так и основными при нажатии Fn. Таким образом, различить способы управления на физическом уровне (например, левый Shift от правого) с помощью данной функции нельзя.

В API определены константы для следующих клавиш.

Идентификатор

Описание

TERMINAL_KEYSTATE_LEFT

Стрелка влево

TERMINAL_KEYSTATE_UP

Стрелка вверх

TERMINAL_KEYSTATE_RIGHT

Стрелка вправо

TERMINAL_KEYSTATE_DOWN

Стрелка вниз

TERMINAL_KEYSTATE_SHIFT

Shift

TERMINAL_KEYSTATE_CONTROL

Ctrl

TERMINAL_KEYSTATE_MENU

Windows

TERMINAL_KEYSTATE_CAPSLOCK

CapsLock

TERMINAL_KEYSTATE_NUMLOCK

NumLock

TERMINAL_KEYSTATE_SCRLOCK

ScrollLock

TERMINAL_KEYSTATE_ENTER

Enter

TERMINAL_KEYSTATE_INSERT

Insert

TERMINAL_KEYSTATE_DELETE

Delete

TERMINAL_KEYSTATE_HOME

Home

TERMINAL_KEYSTATE_END

End

TERMINAL_KEYSTATE_TAB

Tab

TERMINAL_KEYSTATE_PAGEUP

PageUp

TERMINAL_KEYSTATE_PAGEDOWN

PageDown

TERMINAL_KEYSTATE_ESCAPE

Escape

Функция возвращает двухбайтовое целочисленное значение, в котором с помощью пары битов сообщается текущее состояние запрошенной клавиши.

Младший бит позволяет отслеживать нажатия клавиши с момента предыдущего вызова функции. Например, если TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE) вернула в какой-то момент 0, затем пользователь нажал Escape, то при следующем вызове TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE) вернет 1. Если клавиша будет нажата еще раз, то значение снова станет равно 0. И так далее.

Для клавиш, отвечающих за переключение режимов ввода, таких как CapsLock, NumLock, ScrollLock, положение бита указывает, включен ли или выключен соответствующий режим.

Старший бит второго байта (0x8000) взводится в том случае, если клавиша нажата (и не отпущена) в текущий момент.

Данная функция не может использоваться для отслеживания нажатий буквенно-цифровых и функциональных клавиш. Для этой цели необходимо реализовать в программе обработчик OnChartEvent и перехватывать сообщения с кодом CHARTEVENT_KEYDOWN. Обратите внимание, что события генерируются на графике и доступны только для экспертов и индикаторов. Программы других типов (скрипты и сервисы) не поддерживают событийную модель программирования.

В скрипте EnvKeys.mq5 организован цикл по всем константам TERMINAL_KEYSTATE.

void OnStart()
{
   for(ENUM_TERMINAL_INFO_INTEGER i = TERMINAL_KEYSTATE_TAB;
      i <= TERMINAL_KEYSTATE_SCRLOCK; ++i)
   {
      const string e = EnumToString(i);
      // пропускаем значения, не являющиеся элементами перечисления
      if(StringFind(e"ENUM_TERMINAL_INFO_INTEGER") == 0continue;
      PrintFormat("%s=%4X"e, (ushort)TerminalInfoInteger(i));
   }
}

Вы можете поэкспериментировать с нажатиями клавиш и включением/отключением режимов клавиатуры, и понаблюдать за тем, как меняются значения в журнале.

Например, если капитализация по умолчанию отключена, увидим строку:

TERMINAL_KEYSTATE_SCRLOCK= 0

Если нажать клавишу ScrollLock и, не отпуская, запустить скрипт еще раз, получим запись:

TERMINAL_KEYSTATE_CAPSLOCK=8001

То есть режим уже включен, а клавиша нажата. Отпустим клавишу, и в следующий раз скрипт выдаст:

TERMINAL_KEYSTATE_SCRLOCK= 1

Режим остался включенным, но клавиша отпущена.

TerminalInfoInteger не подходит для проверки статуса клавиш (TERMINAL_KEYSTATE_XYZ) в зависимых индикаторах созданных вызовом iCustom или IndicatorCreate — в них функция всегда возвращает 0, даже если индикатор был добавлен на график с помощью ChartIndicatorAdd.

Также функция не работает в те моменты, когда график MQL-программы не является активным (то есть пользователь переключился на другой). MQL5 не предоставляет средств для постоянного контроля за клавиатурой.