Что скажут профи: Как получить значения скрола мышки в MQL? [репост с пятого форума]

 
Речь идет о виндовых DLL. Написание своей пока что не рассматривается.


После штудирования инета определился с тремя возможностями:

1. Обработка WM_MOUSEWHEEL
2. Обработка WM_INPUT
3. Получение данных мышки из DirectInput.

В первом варианте предполагается наличие окна, где это событие обрабатывается. К сожалению не знаю как добраться к очереди сообщений окна терминала из MQL, поэтому этот вариант отпал. http://www.rsdn.ru/article/baseserv/hookdll.xml

Второй вариант тоже предполагает окно, но была надежда, что обращаясь к функции GetRawInputBuffer, смогу получить данные, минуя терминал.

У меня получилось воспользоваться всеми функциями регистрации и получения информации. А именно:
GetRawInputDeviceInfo

GetRawInputDeviceList

GetRegisteredRawInputDevices

RegisterRawInputDevices

Но функция GetRawInputBuffer, которая нужна, не заработала. Буфер пуст, данные в него не захватываются.


С третьим вариантом к сожалению тоже не получилось, так как не знаю как получить экземпляр интерфейса LPDIRECTINPUTDEVICE8 / LPDIRECTINPUT8.


Знатоки, что посоветуете?


Присоединяюсь к вопросу.
 

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

Если исходить из того, что написание собственной DLL не рассматривается, то может тогда и от API отказаться? Если косвенный способ подходит, то:

Вешаем на график зацикленный скрипт, который проверяет индекс первого видимого бара в окне - WindowFirstVisibleBar (можно вместе с количеством баров в окне - WindowBarsPerChart). Если отличаются от предыдущего значения, то совершались действия с графиком. Правда, в этом случае не только колесико мыши могло быть причиной (изменение масштаба по времени - "+", "-", нажатие Home или End, прямой переход к нужной дате).

В любом случае, пока мало информации для того, чтобы понять, что именно требуется от определения события кручения колесика мыши. Тогда можно и методы подсказать.

P.S. Ну а если нужен доступ к функции обработки окна, то это SetWindowLongPtr (см. msdn). Но без DLL тут не обойтись, т.к. нельзя назначить новую процедуру обработки сообщений, расположенную в MQL-коде.

 

Мысль контролировать скроллинг чарта, была. Но не комильфо....

Нет, нужно определить событие прокрутки колеса.

 
Scriptong:

В любом случае, пока мало информации для того, чтобы понять, что именно требуется от определения события кручения колесика мыши. Тогда можно и методы подсказать.


что именно требуется?

список крутить конечно. что же еще? :)

 

нет. там хук. в MQL незнамо как адрес функции получить.
 
На окно терминала вешать кастомную процедуру обработки событий с перехватом- и всё.
Я у себя так сделал:
- пользователь кликает закрыть окно МТ
- я спрашиваю: вы поменяли индикатор- сохранить? Да Нет Отмена
При отмене никто никуда не выходит.
Да- сохраняем и выходим, нет- не сохраняем и выходим.
Примитивно.

Хуки тут ни при чём, правда.

> Речь идет о виндовых DLL. Написание своей пока что не рассматривается.

Успехов...
 
jartmailru:
На окно терминала вешать кастомную процедуру обработки событий с перехватом- и всё.

то есть речь про SetWindowLong ?
 
sergeev:
то есть речь про SetWindowLong ?
Да.
 
sergeev:

что именно требуется?

список крутить конечно. что же еще? :)


Если список (CListCtrl) - свой объект, то в чем проблема? События от мыши получает именно список, а не окно Meta Trader.

Или речь идет о списке, составленном на основе графических объектов MT4?

 
Scriptong:


Если список (CListCtrl) - свой объект, то в чем проблема? События от мыши получает именно список, а не окно Meta Trader.

Или речь идет о списке, составленном на основе графических объектов MT4?


Если нет проблемы - укажите, пожалуйста, как определить ФАКТ смещения колесика на мышке. Когда указатель оной мышки находится в окошке MT4. А то очень интересненько :)

Само собою,- средствами Windows.

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