Залипает SHIFT?

 

В мт5 версии в обработчике нажатий клавиш  спользуется код   

bool SHIFT = !!TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT);


чтобы получить разные события на X и на Shift-X. Всё работает корректно.


При переносе решения в мт4 иногда работает корректно, но иногда код который отрабатывается при нажатии SHIFT-X начинает отрабатываться и без прижатия Shift, но только когда нажата Х. Т.е. такое ощущение, что мт4 продолжает считать, что Shift нажат. Кто с подобным сталкивался и как решал? Я пока перенес вызов кода на другую клавишу без шифта, но это несколько меняет логику работы пользователя.

 
Nikolay Kuznetsov:


bool SHIFT = !!TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT);

Ай-нэ-нэ код какой-то. Зачем два "!" ? :)

 
Yevhenii Levchenko #:

Ай-нэ-нэ код какой-то. Зачем два "!" ? :)

Короче, чем "(bool)".

 
fxsaber #:

Короче, чем "(bool)".

Спс. Буду знать :)

 
fxsaber #:

Короче, чем "(bool)".

Сам ратую, за то чтобы явно приводить типы параметров/результатов функций, но тут взял просто взял работающий код или не работающий?

 
Nikolay Kuznetsov:

В мт5 версии в обработчике нажатий клавиш  спользуется код   

bool SHIFT = !!TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT);


чтобы получить разные события на X и на Shift-X. Всё работает корректно.


При переносе решения в мт4 иногда работает корректно, но иногда код который отрабатывается при нажатии SHIFT-X начинает отрабатываться и без прижатия Shift, но только когда нажата Х. Т.е. такое ощущение, что мт4 продолжает считать, что Shift нажат. Кто с подобным сталкивался и как решал? Я пока перенес вызов кода на другую клавишу без шифта, но это несколько меняет логику работы пользователя.

Странная конструкция...

Попробуйте так:

//+------------------------------------------------------------------+
//| Возвращает состояние клавиши Ctrl                                |
//+------------------------------------------------------------------+
bool IsCtrlKeyPressed(void) 
  { 
   return(::TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL)<0);
  }
//+------------------------------------------------------------------+
//| Возвращает состояние клавиши Shift                               |
//+------------------------------------------------------------------+
bool IsShiftKeyPressed(void) 
  { 
   return(::TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT)<0);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin #:

Странная конструкция...

Попробуйте так:

О, вспомнил. У себя кодил < -120

if(TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT) < -120) ...
 
Yevhenii Levchenko #:

О, вспомнил. У себя кодил < -120

Оказывается надо было следовать RTFM:

Вызов TerminalInfoInteger(TERMINAL_KEYSTATE_XXX) возвращает такой же код состояния клавиши, как и функция GetKeyState() из MSDN.

GetKeyState function (winuser.h) - Win32 apps
GetKeyState function (winuser.h) - Win32 apps
  • 2022.08.04
  • jwmsft
  • learn.microsoft.com
Retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled (on, off�alternating each time the key is pressed).