Скачать MetaTrader 5

WIN API + MQL4 Помогите получить ID меню и текст.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
FoxFx
45
FoxFx  

Помогите пожалуйста получить ID позиции меню в MT4 а также текст (название пункта). Класс "32768"

Вот привожу скрин примера того что нужно достать. Если это возможно конечно то без самописных DLL, а использовать только библиотеки Win

Нужна пара данных, текст и номер позиции в списке. По ходу экспериментов понял, что данные эти лежат видимо в виде структуры.

Прошу помочь конкретным примером. Если невозможно без своей DLL, то прошу показать как получить любой из вышеуказанных параметров.



Alexey Navoykov
4777
Alexey Navoykov  

Без самописных DLL тут не обойтись к сожалению, т.к. необходим перехват оконных сообщений, а именно - появление всплывающего меню. Оно создаётся динамически, поэтому заранее невозможно узнать о нём ничего. Да даже когда оно и присутствует на экране, то обычными функциями WinApi из него ничего достать не получится, т.к. PopupMenu - это особый класс объектов и доступ к ним идёт через методы класса.

Но зачем тебе всё это, если не секрет? Ведь чтобы выбрать любой пункт меню, достаточно отправить PostMessage с определённым кодом окну терминала. Код этот можно узнать, отлавливая сообщения с помощью Spy++ например. Или тебе нужно именно текст считывать?

FoxFx
45
FoxFx  
Meat:

Без самописных DLL тут не обойтись к сожалению, т.к. необходим перехват оконных сообщений, а именно - появление всплывающего меню. Оно создаётся динамически, поэтому заранее невозможно узнать о нём ничего. Да даже когда оно и присутствует на экране, то обычными функциями WinApi из него ничего достать не получится, т.к. PopupMenu - это особый класс объектов и доступ к ним идёт через методы класса.

Но зачем тебе всё это, если не секрет? Ведь чтобы выбрать любой пункт меню, достаточно отправить PostMessage с определённым кодом окну терминала. Код этот можно узнать, отлавливая сообщения с помощью Spy++ например. Или тебе нужно именно текст считывать?

Да. мне нужно именно текст прочитать, сейчас пояснения некоторые сделаю.

На приведенном мною скрине есть приложение, которое показывает всю информацию об этом меню, включая текст пункта и все остальное. я специально сделал этот скрин, дабы исключить высказывания в сторону невозможности это реализовать. Приложение это работает и достает данные с помощью WIN API. Надо знать только как оно это делает. приложение это сделано в делфи или визуал бейсике.

В данный момент у меня такая задача, у каждого Брокера есть несколько серверов на каждом типе счета, надо получить их названия. Если нажать на то место, где отображается трафик( в правом нижнем углу) то появляется меню, где видны текущие сервера которые можно выбирать вручную, а также отмечен текущий к которому мы подключены галочкой. С помощью PostMessage я переключаю эти сервера, а также даю команду пересканировать сервера без проблем.

На каждый пункт свой отдельный код, эти коды известны и не меняются со временем. Но вот сам список динамический, поэтому сервер который был вверху на следующем вызове может оказаться уже внизу или в середине списка. У меня есть предположение что они сортируются по пингу, который периодически обновляется, поэтому в меню в списке постоянные изменения, но вот переход на лучший из них не происходит. Поэтому я хотел с некоторым интервалом получать ID (как раз по названию в меню) нужного пункта в меню и сопоставлять их текст с шаблоном, и проверять работает правильный сервер или нет. Если неправильный, то определяем его ID в меню и посылаем команду подключиться к нему.

Если есть альтернатива, то с удовольствием ее применил бы, может подскажите где достать инфу в этом направлении. Может считать в файле каком в папке терминала, или реестре.

Рустам
3597
Рустам  
Поройтесь в кодбейзе, давным давно был скрипт позволяющий в авторежиме переключать сервера, (это на русской зоне), и посмотрите внимательно на англоязычную часть, там сейчас есть очень неплохие вещи с применением ВИНАПИ
FoxFx
45
FoxFx  
FAQ:
Поройтесь в кодбейзе, давным давно был скрипт позволяющий в авторежиме переключать сервера, (это на русской зоне), и посмотрите внимательно на англоязычную часть, там сейчас есть очень неплохие вещи с применением ВИНАПИ

Спасибо за подсказку посмотрю в англоязычной версии, только я в нем совсем плохо ориентируюсь! На русской версии копаюсь уже недели две, ничего по этой теме конкретного не нашел, хотя мне казалось что раньше я видел что кто то, про это меню уже поднимал тему раньше. Чем закончилось к сожалению не знаю, в то время меня это меню не интересовало и эту старую тему я тут не нашел.
Alexey Navoykov
4777
Alexey Navoykov  
kosuhin:

Да. мне нужно именно текст прочитать, сейчас пояснения некоторые сделаю.

На приведенном мною скрине есть приложение, которое показывает всю информацию об этом меню, включая текст пункта и все остальное. я специально сделал этот скрин, дабы исключить высказывания в сторону невозможности это реализовать. Приложение это работает и достает данные с помощью WIN API. Надо знать только как оно это делает. приложение это сделано в делфи или визуал бейсике.

Поизучай тогда тему перехватов оконных сообщений (хуков). Там ничего сложного, тем более что тут даже в чужой процесс внедряться не понадобится.

kosuhin:

Если есть альтернатива, то с удовольствием ее применил бы, может подскажите где достать инфу в этом направлении. Может считать в файле каком в папке терминала, или реестре.

Не, в файлах они вряд ли сохраняются. Я в своё время искал, но не нашёл. Я тоже пытался решить точно такой вопрос насчёт перелогинивания на рабочие сервера, но так и не решил толком. Писать ДЛЛ было лень, поэтому сделал просто последовательный перебор всех серверов (например от 1 до 5). Вроде работает более-менее, поэтому и не стал больше заморачиваться.

Vadim Zhunko
5226
Vadim Zhunko  
Хуки МТ4 не любит. Но перехватить оконные сообщения можно.
FoxFx
45
FoxFx  
Meat:

Поизучай тогда тему перехватов оконных сообщений (хуков). Там ничего сложного, тем более что тут даже в чужой процесс внедряться не понадобится.

Не, в файлах они вряд ли сохраняются. Я в своё время искал, но не нашёл. Я тоже пытался решить точно такой вопрос насчёт перелогинивания на рабочие сервера, но так и не решил толком. Писать ДЛЛ было лень, поэтому сделал просто последовательный перебор всех серверов (например от 1 до 5). Вроде работает более-менее, поэтому и не стал больше заморачиваться.

Не понимаю смысл простого перебора, мне нужно выбрать конкретный сервер, их несколько, список динамический поэтому просто его порядковым номером в списке мне не обойтись. Для его идентификации необходимо прочитать его название или возможно IP адрес. Без своей DLL тут точно не обойтись так как эти данные хранятся в виде особого класса, возможно без самопиской DLL это и можно сделать но только в MQL5. Очень плохо разбираюсь в написании сомописных DLL,но это вопрос времени. Жаль конечно что гуру в этом вопросе предпочитают молчать. Могли бы и поделится функцией которую нужно разместить в свой DLL библиотеке в качестве примера, достаточно прочитать любой параметр а уж нужное я думаю сам оттуда достану.

Собственно мне это видится следующим образом, я вызываю то самое меню с некоторым интервалом времени для проверки. Потом определяю на каком сервере в данный момент находится галочка. Далее если сервер не тот, ищу его порядковый номер в списке и посылаю код выбрать его, коды для выбора известны, непонятно только как вызвать то окно и считать текущий сервер а также определить ID нужного сервера в текущем списке.

Yuri
634
Yuri  

Вот тут ( https://forum.mql4.com/ru/17146/page7 ) что то писали.

Только к чему писать ДЛЛ, пишите сразу отдельную программу, пусть периодически нажимает кнопку мышки в нужном месте и пытается прочитать и поменять что нужно.

FoxFx
45
FoxFx  
yuripk:

Вот тут ( https://forum.mql4.com/ru/17146/page7 ) что то писали.

Только к чему писать ДЛЛ, пишите сразу отдельную программу, пусть периодически нажимает кнопку мышки в нужном месте и пытается прочитать и поменять что нужно.

Спасибо! К сожалению, там я ничего не нашел по работе с меню класса "32768" а у него свои особенности, по идее и так нужно все разместить в свою DLL, а из терминала только вызывать функцию. Передавая ей хендл главного окна терминала. отдельный софт не очень удобно, особенное если несколько терминалов, а у меня их очень много одновременно работает.
Alexey Navoykov
4777
Alexey Navoykov  

Конечно только ДЛЛ. А отдельная программа тут совершенно не к месту.

Насчёт класса "32768" (всплывающее меню) - это действительно какая-то хитрая штука. Есть штатные WinApi функции для работы с меню - они для всплывающего меню тоже работают, но только если ты сам создал это меню и знаешь его хэндл. А вот получить хэндл чужого всплывающего меню с помощью GetMenu почему-то не удаётся, а соответственно и вытянуть инфу из него не получится. Я гуглил на эту тему, но тоже ничего конкретного не нашёл. А в MSDN сказано что, что Popup-menu относятся в какой-то технологии Microsoft Active Accessibility, а там всё как-то запутано... В общем я и забил на это дело :) Но возможно удастся получить хэндл меню с помощью хуков, о чём я писал выше. А ещё лучше - подмена оконной процедуры. Короче перехватить сообщение о создании меню и узнать оттуда его хэндл, а может и всю остальную инфу.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий