Событие KEYDOWN и язык ввода

 

Как известно при событии KeyDown приходят VK_ коды в lparam

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра sparam

Событие нажатия клавиатуры

CHARTEVENT_KEYDOWN

Код нажатой клавиши

Количество нажатий клавиши,сгенерированных за время её удержания в нажатом состоянии

Строковое значение битовой маски, описывающее статус кнопок клавиатуры


Но вопрос - как из этого набора данных получить правильный символ?

Ведь при приходе lparam=VK_Z  это может означать и 'z', 'я', 'Я', 'y', 'Y' - в  зависимости от языка ввода и раскладки.

Задачу с "строчная/прописная" сейчас можно частично решить, зная состояние капса или шифта https://www.mql5.com/ru/docs/constants/environment_state/terminalstatus

Но всё осложняется, если имеем составные символы типа китайский, арабский и т.д.

---

Посоветуйте, как определить в рамках MQL какой символ в реальности ожидается юзером, а не просто VK_ ?

Что стоит просить в СД из функций WinApi, чтоб это стало возможным в MQL нативно?

 
o_O:

...

Посоветуйте, как определить в рамках MQL какой символ в реальности ожидается юзером, а не просто VK_ ? 

... 

Пока только делать готовые наборы символов под разные клавиатурные раскладки.

В событии CHARTEVENT_KEYDOWN:

  • lparam это коды символов ASCII и управляющих клавиш.
  • sparam это скан-коды клавиш.
  • dparam сейчас похоже вообще не работает. Нужно обратиться в сервисдеск.

Также в сервисдеск: 

  • Нужна возможность отключать скроллинг графика клавишами "Стрелка влево", "Стрелка вправо", "Home", "End", "Page Up" и "Page Down".
  • Нужна возможность отключать масштабирование графика клавишами "+" и "-".
  • Нужна возможность получать текущий язык ввода в системе. Иначе пришлось писать свою версию.

P.S.

Кстати, скоро будет готова статья на эту тему. Представлю свою версию класса (CTextBox) для создания многострочного текстового поля ввода без ограничений.

 
Anatoli Kazharski:
  • Нужна возможность получать текущий язык ввода в системе. Иначе пришлось писать свою версию.


это ответ на мой сабж? ))
 
o_O:
это ответ на мой сабж? ))
Нет. Это просто предложение в сервисдеск. 
 
   if(id==CHARTEVENT_KEYDOWN)
     {
      bool caps=(TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT)&0x8000)!=0;      
      if((TerminalInfoInteger(TERMINAL_KEYSTATE_CAPSLOCK)&1)==1)
         caps=!caps;
      //--- получение кода выбранного языка
      //--- в язык MQL пока не добавлено, но в последних билдах терминала уже есть
      ushort lang=(ushort)TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)1255);
      Print(lparam," ",caps," ",StringFormat("%X",lang));
     }
 
Ilyas:
   if(id==CHARTEVENT_KEYDOWN)
     {
      bool caps=(TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT)&0x8000)!=0;      
      if((TerminalInfoInteger(TERMINAL_KEYSTATE_CAPSLOCK)&1)==1)
         caps=!caps;
      //--- получение кода выбранного языка
      //--- в язык MQL пока не добавлено, но в последних билдах терминала уже есть
      ushort lang=(ushort)TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)1255);
      Print(lparam," ",caps," ",StringFormat("%X",lang));
     }


Ильяс, а как быть в сложных символах?

например один иероглиф требует нажатия нескольких клавиш.

Как переводить то, что нажимает юзер, в получаемый символ?

Другими словами - как из потока событий KeyDown получать то, что мы обычно видим при вводе в поле Edit?

---

Может стоит сделать в MQL функцию, которая преобразует VK_ в реальный символ согласно таблице текущей раскладки клавиатуры?

я имею ввиду ToUnicodeEx https://msdn.microsoft.com/de-de/library/windows/desktop/ms646322(v=vs.85).aspx

 

Вот для теста можете проверить


#import "User32.dll"
int ToUnicodeEx(uint uVirtKey, uint uScanCode, char& lpKeyState[], short& pwszBuff, int cchBuff, uint wFlags, uint dwhkl);
#import

//------------------------------------------------------------------    OnChartEvent
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
        switch (id)
        {
        case CHARTEVENT_KEYDOWN:
                {
                        //1255 - код текущего языка ввода
                        short lng=(short)TerminalInfoInteger((ENUM_TERMINAL_INFO_INTEGER)1255);
                        uint nChar=(uint)lparam, nRepCnt=(uint)dparam, nFlags=(uint)StringToInteger(sparam);
                        char lpKeyState[257]={0};
                        short lpChar=0;
                        int rr=ToUnicodeEx(nChar, 0, lpKeyState, lpChar, 1, 0, lng);
                        Print(nChar," ",rr,"  ",ShortToString(lpChar));
                }
                break;
        }
}


В журнал пойдут символы, которые точно соответствуют текущей раскладке

Lang (EURUSD,D1)    65 1  a
Lang (EURUSD,D1)    83 1  s

а это на Бенгали

Lang (EURUSD,D1)    65 1  ো
Lang (EURUSD,D1)    83 1  ে


 
Создайте пожалуйста заявку, мы подумаем, думаю что реализуем...
 

Создал заявку (#1651549) по своим пунктам.

  • Нужна возможность отключать скроллинг графика клавишами "Стрелка влево", "Стрелка вправо", "Home", "End", "Page Up" и "Page Down".
  • Нужна возможность отключать масштабирование графика клавишами "+" и "-".

Уже принята к рассмотрению.

 
Ilyas:
Создайте пожалуйста заявку, мы подумаем, думаю что реализуем...

Огромное спасибо.

Если это сделаете, то все критичные потребности проекта закроются. Можно будет опубликовать! )

 
o_O:

Если это сделаете, то все критичные потребности проекта закроются. Можно будет опубликовать! )

Ну наконец-то! Ждём. )