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

 
Meat:

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

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

А можно пример функции которую можно поместить в свою DLL, если хендл меню заранее получен .

Например прочитать text одного из пунктов. Ведь эта программа делает это без проблем.

И кстати зачем получать хендл чужого окна, если мы мы это сделаем из терминала, это же свой процесс.

Прикрепил очень полезную программу которая предназначена для работы как раз с такими меню.

Файлы:
menuspy.zip  20 kb
 
kosuhin:

А можно пример функции которую можно поместить в свою DLL, если хендл меню заранее получен .

Например прочитать text одного из пунктов. Ведь эта программа делает это без проблем.

И кстати зачем получать хендл чужого окна, если мы мы это сделаем из терминала, это же свой процесс.

Прикрепил очень полезную программу которая предназначена для работы как раз с такими меню.


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

 
Meat:


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

Это было бы просто отлично! ))
 
Может вот это поможет. Вроде из этой структуры надо доставать нужные данные. http://msdn.microsoft.com/en-us/library/bb775804%28VS.85%29.aspx
 

Я уже разобрался в чём было дело, полистав исходники той проги. Оказывается нужно получать хэндл всплывающего меню с помощью SendMessage (hwnd, MN_GETHMENU,0,0), а вовсе не GetMenu(hwnd), как я полагал. Нигде об этом почему-то не сказано в документации. Ну тогда вопрос решён. Можно даже без написания DLL обойтись по идее. Щас набросаю вариантик.

 
Meat:

Я уже разобрался в чём было дело, полистав исходники той проги. Оказывается нужно получать хэндл всплывающего меню с помощью SendMessage (hwnd, MN_GETHMENU,0,0), а вовсе не GetMenu(hwnd), как я полагал. Нигде об этом почему-то не сказано в документации. Ну тогда вопрос решён. Можно даже без написания DLL обойтись по идее. Щас набросаю вариантик.

Так текст вроде надо получать из структуры, а как ее запихать в функцию из mql4.
 

Да запихать то не проблема... Зато есть проблема в том, что как выяснилось, все элементы этого меню имеют свойство ownerdraw, это значит в самом меню они не хранятся, а присылаются ему приложением по запросу. Единственное что удаётся вытянуть из меню - это количество элементов. Поэтому видимо без ДЛЛ не обойтись, т.к. придётся перехватывать сообщения, как это и сделано в MenuSpy

 

Итак, результат получен. Всё оказалось намного проще, чем мы предполагали сначала. Вкладываю демонстрационный скрипт. Там в коде нужно поменять название сервера на то, которое вам нужно, и всё. Скрипт коннектитися к этому серверу.

Файлы:
 
Meat:

Итак, результат получен. Всё оказалось намного проще, чем мы предполагали сначала. Вкладываю демонстрационный скрипт. Там в коде нужно поменять название сервера на то, которое вам нужно, и всё. Скрипт коннектитися к этому серверу.

Респект! Небольшой бонус за труды отправил на ваш кошелек, спасибо за помощь!
 
И мне помогло, СПАСИБО за помощь!!!
Причина обращения: