Ошибки в функциях, использующих winuser.h

 

Недавно я обнаружил 2 ошибки в функциях, использующих функции winuser.h (что может быть простым совпадением), о которых я сообщил на английских форумах и надеюсь, что они будут исправлены.

Во-первых, TerminalInfoInteger иногда вызывает аномальное завершение при проверке состояния клавиш (если он удален в середине вызова функции):

void OnInit()
{

   EventSetMillisecondTimer(10);
}

void OnTimer(void)
{
   Print("Input timer 1");
   TerminalInfoInteger(TERMINAL_KEYSTATE_UP);
   TerminalInfoInteger(TERMINAL_KEYSTATE_DOWN);
   TerminalInfoInteger(TERMINAL_KEYSTATE_LEFT);
   TerminalInfoInteger(TERMINAL_KEYSTATE_RIGHT);
   Print("Input timer 2");
   TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT);
   TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL);
   TerminalInfoInteger(TERMINAL_KEYSTATE_ENTER);
   TerminalInfoInteger(TERMINAL_KEYSTATE_ESCAPE);
   Print("Input timer 3");
   TerminalInfoInteger(TERMINAL_KEYSTATE_DELETE);
   TerminalInfoInteger(TERMINAL_KEYSTATE_INSERT);
   TerminalInfoInteger(TERMINAL_KEYSTATE_TAB);
   TerminalInfoInteger(TERMINAL_KEYSTATE_HOME);
   Print("Input timer 4");
   TerminalInfoInteger(TERMINAL_KEYSTATE_END);
   TerminalInfoInteger(TERMINAL_KEYSTATE_PAGEUP);
   TerminalInfoInteger(TERMINAL_KEYSTATE_PAGEDOWN);
   TerminalInfoInteger(TERMINAL_KEYSTATE_MENU);
   Print("Input timer 5");
   TerminalInfoInteger(TERMINAL_KEYSTATE_CAPSLOCK);
   TerminalInfoInteger(TERMINAL_KEYSTATE_NUMLOCK);
   TerminalInfoInteger(TERMINAL_KEYSTATE_SCRLOCK);

   Print("Input timer end");
}

void OnDeinit(const int reason)
{

   Print("DeInit");

   EventKillTimer();
}

 

Во-вторых, TranslateKey не поддерживает мертвые клавиши. Я провел дополнительные тесты в своем сообщении на английском форуме, но я использовал испанскую клавиатуру.

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam)
{
        if (id!=CHARTEVENT_KEYDOWN) return;
        Print(lparam, " ", ShortToString(TranslateKey((int)lparam)));
}
//РЕЗУЛЬТАТ (после нажатия некоторых клавиш на испанской клавиатуре)
//65 a
//186 `
//65 a
//16 
//186 ^
//65 A

Для русской мнемонической клавиатуры вы могли бы проверить такие комбинации, я думаю:

Ожидаемым результатом нажатия мертвой клавиши + клавиши будет комбинированный символ (как это происходит при написании в редакторе или в веб-браузерах). Фактический результат эквивалентен нажатию каждой клавиши 2 раза и получению последнего символа.


Насколько я знаю, причина второй ошибки в том, что каждое нажатие клавиши отправляется в ToUnicodeEx (самим metatrader, возможно, используется для записи правок), поэтому при использовании TranslateKey оно считается вторым нажатием клавиши, поэтому отказ от вызова любой из функций, когда это не нужно, должен решить проблему (если это невозможно по каким-либо техническим причинам, следует использовать другой подход). Что касается первой ошибки, то я совершенно не представляю, что может вызывать аномальные завершения.

У меня есть еще одно предложение: я заметил, что значения перечисления keystate в ENUM_TERMINAL_INTEGER в основном равны 1000+keycode, но только некоторые терминальные ключи определены (и возвращают допустимые значения). Нельзя ли сделать доступным состояние остальных ключей (даже без добавления новых значений перечисления)? Или есть какие-то причины, по которым это не может быть реализовано?

Причина обращения: