检查键盘状态

TerminalInfoInteger 函数可用于找出控制键的状态,控制键也称为虚拟键。这些键具体包括 CtrlAltShiftEnterInsDelEsc、箭头键等等。它们被称为虚拟键,因为原则上,键盘提供了多种方式来实现同一控制操作。例如,空格键左侧和右侧都有相同的 CtrlShiftAlt 键,而光标既可以使用专用按键移动,也可以在按下 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。

对于负责切换输入模式的按键,诸如 CapsLockNumLock 以及 ScrollLock,位的位置指示对应模式是已启用还是已禁用。

如果在当前时刻该按键被按下(且未松开),则第二字节 (0x8000) 的最高有效位被置位。

该功能不能用于跟踪字母数字键和功能键的按键情况。为此,有必要实现 OnChartEvent 处理程序,并以程序中的 CHARTEVENT_KEYDOWN 代码截取消息。请注意,事件在图表上生成,并且仅对 EA 交易和指标可用。其它类型的程序(脚本和服务)不支持事件编程模型。

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);
      // skip values that are not enum elements
      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): iCustomIndicatorCreate 。在这两个函数中,该函数始终返回 0,即使该指标是使用 ChartIndicatorAdd添加到图表。

此外,当 MQL 程序图表未处于活动状态时(用户已切换至另一个),该函数无效。MQL5 不提供对键盘永久控制的方法。