...
Посоветуйте, как определить в рамках MQL какой символ в реальности ожидается юзером, а не просто VK_ ?
...
Пока только делать готовые наборы символов под разные клавиатурные раскладки.
В событии CHARTEVENT_KEYDOWN:
- lparam это коды символов ASCII и управляющих клавиш.
- sparam это скан-коды клавиш.
- dparam сейчас похоже вообще не работает. Нужно обратиться в сервисдеск.
Также в сервисдеск:
- Нужна возможность отключать скроллинг графика клавишами "Стрелка влево", "Стрелка вправо", "Home", "End", "Page Up" и "Page Down".
- Нужна возможность отключать масштабирование графика клавишами "+" и "-".
- Нужна возможность получать текущий язык ввода в системе. Иначе пришлось писать свою версию.
P.S.
Кстати, скоро будет готова статья на эту тему. Представлю свою версию класса (CTextBox) для создания многострочного текстового поля ввода без ограничений.
- Нужна возможность получать текущий язык ввода в системе. Иначе пришлось писать свою версию.
это ответ на мой сабж? ))
{
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));
}
{
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".
- Нужна возможность отключать масштабирование графика клавишами "+" и "-".
Уже принята к рассмотрению.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как известно при событии 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 нативно?