Скрипты: Interception

 

Interception:

Перехват в скрипте нажатия клавиш или мыши в окнах MetaTrader. Может понадобиться для написания управляемых пользователем действий.

Author: Слава

 
Полезная разработка !
Спасибо.
А можно узнать номер бара и цену, на которой случился клик мышкой :) ?
 
Begun wrote:
Полезная разработка !
Спасибо.
А можно узнать номер бара и цену, на которой случился клик мышкой :) ?
Можно получить экранные координаты, координаты внутри окна, но это будут координаты в пикселях (x,y), а как их перевести в логические координаты - время/котировка я не знаю.
 
А может уважаемые разработчики подскажут ?
Спасибо.
 
Уважаемый Слава!
А можно такую функцию добавить в Вашу разработку:
возвращать название активного окна без нажатия клавиши или мыши,
то есть в к5аждый момент времени знать какое окно активное.
 
Referent wrote:
Уважаемый Слава!
А можно такую функцию добавить в Вашу разработку:
возвращать название активного окна без нажатия клавиши или мыши,
то есть в к5аждый момент времени знать какое окно активное.
Можно, но ничего добавлять не нужно - только изменить скрипт обработчик:

//+------------------------------------------------------------------+ //| shablon.mq4 | //| Viatcheslav Suvorov | //+------------------------------------------------------------------+ #property copyright "Viatcheslav Suvorov" #property show_inputs #include <WinUser32.mqh> #import "IdleLib.dll" int GetLastKeyWP(); int GetLastMouseWP(); int IdleLibInit(); int IdleLibUnInit(); string GetActiveWndName(); #import int start() { IdleLibInit();//инициализируем Dll для перехвата событий bool NeedLoop=true; string predwnd=''; while(NeedLoop){ // int lastkey=GetLastKeyWP();//Опрашиваем код посл. клавиши // int lastmouse=GetLastMouseWP();//Опрашиваем код мыши string lastwnd=GetActiveWndName();//Имя окна Metatrader где произошло событие if ((predwnd!=lastwnd) && lastwnd!="") { Print("Активное окно ",lastwnd); predwnd=lastwnd; } else { // Print("Активное окно ",predwnd); //активное окно не изменилось } Sleep(100); }//while return(0); } void deinit() { IdleLibUnInit(); }

Будет выодить имя окна когда изменилось активное. В блок
} else { // Print("Активное окно ",predwnd); //активное окно не изменилось }

можно добавить обработку если активное окно осталось тем же. Т.е. в любой момент имеем имя окна.
Можно так же добавить обработку случая когда не одно окно MetaTrader не имеет фокуса (т.е. пользователь переключился на другое приложение):
if (lastwnd="") { ////////////////// }
 
Avals wrote:
Begun wrote:
Полезная разработка !
Спасибо.
А можно узнать номер бара и цену, на которой случился клик мышкой :) ?
Можно получить экранные координаты, координаты внутри окна, но это будут координаты в пикселях (x,y), а как их перевести в логические координаты - время/котировка я не знаю.
Если известен размер окна в пикселях, тогда запросто можно воспользоваться функциями BarsPerWindow и FirstVisibleBar. Нет никаких проблем, чтобы вычислить номер бара.
Сложнее с координатой цены. Если масштаб - автоматический, то можно посчитать, прибавив по 5 процентов от разнициы между наибольшим и наименьшим значениями цен сверху и снизу. Если масштаб - фиксированный, то посчитать нельзя, так как отсутствует информация о верхней и нижней границе.
 

Очень хорошая и полезная идея!

Уважаемый Avals!

У меня к Вам такой вопрос. А можно ли сделать обратную эмуляцию команды. Вот например я нахожусь в окне графика любой валютной пары, и нажимаю правую кнопку. Открывается окно, Ваш shablon показывает код мыши 517, затем я жму на надпись "Обновить" - shablon выдает код 513. Мне нужно сделать так, чтобы когда я мышкой передвигаю Object помещенный на конце индикатора - в этот момент эмулировалась бы команда "Обновить" код 513.

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

Заранее благодарю за ответ. Если это выходит за рамки обсуждения данной темы, то ответить можно на адресс ANG3110@latchess.com .

 
тут глючок небольшой имеется... железно зашито в dll имя окна метатрейдера :/
а если программа называется как-нибудь по-другому, то getactiveWndname ни чего не возвращает... и ни как не узнать :(
 

Здравствуйте Слава! А что делать, всё таки, если платформа называется не Метатрейдер, а Телетрейдер? Библиотека dll к сож. не работает. ... не распознает. Посоветуете?

 
GeorgeU:

Здравствуйте Слава! А что делать, всё таки, если платформа называется не Метатрейдер, а Телетрейдер? Библиотека dll к сож. не работает. ... не распознает. Посоветуете?

скопировать файл C:Program FilesMetaTrader 4profilesconfiguration.ini от "правильного" МТ в
C:Program FilesTeletrader 4profilesconfiguration.ini

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