реакция на нажатие горячих клавиш в MT5

 
Подскажите, пож, как в MT5 организовать реакцию советника на нажатие комбинации клавиш, например, Cntrl+Q. Отдельно каждую клавишу CHARTEVENT_KEYDOWN отрабатывает. А "поймать" комбинацию, не получается. PS: если вопрос не по теме, подскажите, где его можно задать. Спасибо
 
MrVIS:
Подскажите, пож, как в MT5 организовать реакцию советника на нажатие комбинации клавиш, например, Cntrl+Q. Отдельно каждую клавишу CHARTEVENT_KEYDOWN отрабатывает. А "поймать" комбинацию, не получается. PS: если вопрос не по теме, подскажите, где его можно задать. Спасибо
bool isCtrlKeyPressed(void) {return((TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)1017)&0x80)!=0);}
 
Artyom Trishkin:
Большое спасибо, Артем! А как формируются коды для других комбинаций? Где это можно прочитать? Спасибо
 
MrVIS:
Большое спасибо, Артем! А как формируются коды для других комбинаций? Где это можно прочитать? Спасибо

Ну насчёт формирования других кодов - не встречал, а посмотреть что возвращается можно так:

//+------------------------------------------------------------------+
//|                                                 isKeyPressed.mq4 |
//|              Copyright 2015, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   string ctrl_key_txt=(isCtrlKeyPressed())?"\nCtrl key is pressed":"\nCtrl key is not pressed";
   if(id==CHARTEVENT_KEYDOWN) {
      Alert("Key Code: "+IntegerToString(lparam)+"\nNumPress: "+DoubleToString(dparam,0)+"\nMask: "+sparam+ctrl_key_txt);
      }
  }
//+------------------------------------------------------------------+
bool isCtrlKeyPressed(void) {return((TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)1017)&0x80)!=0);}
//+------------------------------------------------------------------+

Просто выводит все параметры события в окно оповещения.

 
Artyom Trishkin:

Ну насчёт формирования других кодов - не встречал, а посмотреть что возвращается можно так:

Просто выводит все параметры события в окно оповещения.

Еще раз спасибо. Если не затруднит, поясните, пож, что означают коды 1017 и шестнадцатиричный 0х80? Будут ли они "работать" для просмотра возвращаемых последовательностей с нажатым шифтом?
 
MrVIS:
Еще раз спасибо. Если не затруднит, поясните, пож, что означают коды 1017 и шестнадцатиричный 0х80? Будут ли они "работать" для просмотра возвращаемых последовательностей с нажатым шифтом?
Shift, наскольк мне известно, не отслеживается терминалом. По-крайней мере не видел об этом от разработчиков ничего. Функцию эту выкладывали разработчики с пояснением, что нажатие Ctrl так можно отследить, но в справке об этом пока нет ничего, да и идентификатора свойства в перечислении ENUM_TERMINAL_INFO_INTEGER функции TerminalInfoInteger(), возвращающего состояние Ctrl пока нету в справке.
 
Artyom Trishkin:
Shift, наскольк мне известно, не отслеживается терминалом. По-крайней мере не видел об этом от разработчиков ничего. Функцию эту выкладывали разработчики с пояснением, что нажатие Ctrl так можно отследить, но в справке об этом пока нет ничего, да и идентификатора свойства в перечислении ENUM_TERMINAL_INFO_INTEGER функции TerminalInfoInteger(), возвращающего состояние Ctrl пока нету в справке.
Спасибо за подробный ответ и разъяснение.
 
Artyom Trishkin:
Shift, наскольк мне известно, не отслеживается терминалом. По-крайней мере не видел об этом от разработчиков ничего. Функцию эту выкладывали разработчики с пояснением, что нажатие Ctrl так можно отследить, но в справке об этом пока нет ничего, да и идентификатора свойства в перечислении ENUM_TERMINAL_INFO_INTEGER функции TerminalInfoInteger(), возвращающего состояние Ctrl пока нету в справке.

Для получения состояния клавиши SHIFT - 1016, ALT - 1018

Клавиши Left, Up, Right, Down - 1037,1038,1039,1040 соответственно

 
Ilyas:

Для получения состояния клавиши SHIFT - 1016, ALT - 1018

Клавиши Left, Up, Right, Down - 1037,1038,1039,1040 соответственно

Упс! А вот за сию инфу - огромный человеческий пасиб
 

Скоро дополним перечисление и справку.

Итого, можно получить состояния клавиш Ctrl,Shift,Alt,Left,Up,Right,Down,Ins,Del,Home,End,PgUp,PgDn,CapsLock,NumLock,ScrollLock,Tab,Enter, код равен VK_CODE + 1000

 
Ilyas:

Для получения состояния клавиши SHIFT - 1016, ALT - 1018

Клавиши Left, Up, Right, Down - 1037,1038,1039,1040 соответственно

Такой код не ловит кнопку Alt. Что не так?

//+------------------------------------------------------------------+
//|                                                 isKeyPressed.mq4 |
//|              Copyright 2015, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
//---
//Для получения состояния клавиши SHIFT - 1016, CTRL - 1017, ALT - 1018
//Клавиши Left, Up, Right, Down - 1037,1038,1039,1040 соответственно//---
#define KEY_SHIFT 1016
#define KEY_CTRL  1017
#define KEY_ALT   1018
#define KEY_LEFT  1037
#define KEY_UP    1038
#define KEY_RIGHT 1039
#define KEY_DOWN  1040
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   string control_key_txt=(isCtrlKeyPressed(KEY_SHIFT))?"\nShift key is pressed":
                          (isCtrlKeyPressed(KEY_CTRL))?"\nCtrl key is pressed":
                          (isCtrlKeyPressed(KEY_ALT))?"\nAlt key is pressed":
                          (isCtrlKeyPressed(KEY_LEFT))?"\nLeft key is pressed":
                          (isCtrlKeyPressed(KEY_UP))?"\nUp key is pressed":
                          (isCtrlKeyPressed(KEY_RIGHT))?"\nRight key is pressed":
                          (isCtrlKeyPressed(KEY_DOWN))?"\nDown key is pressed":
                           "\nControl key is not pressed";
   if(id==CHARTEVENT_KEYDOWN) {
      Alert("Key Code: "+IntegerToString(lparam)+"\nNumPress: "+DoubleToString(dparam,0)+"\nMask: "+sparam+control_key_txt);
      }
  }
//+------------------------------------------------------------------+
bool isCtrlKeyPressed(int key_code) {return((TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)key_code)&0x80)!=0);}
//+------------------------------------------------------------------+
Причина обращения: