Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не поставляешь сигналы и не продаешь приложения? Не проблема, заработать могут все!
Ilya Malev
10187
Ilya Malev 2013.04.27 11:18 

Добрый день! Подскажите, как получить дескриптор окна вызвавшего DLL Метатрейдера из этой DLL (C++)?

Без передачи из MQL4 дескриптора функцией WindowHandle, возможно ли получение дескриптора именно того окна МТ, из которого была вызвана DLL?

Спасибо за ответы. 

Vadim Zhunko
5221
Vadim Zhunko 2013.04.27 12:16  
Ant_TL:

Добрый день! Подскажите, как получить дескриптор окна вызвавшего DLL Метатрейдера из этой DLL (C++)?

Без передачи из MQL4 дескриптора функцией WindowHandle, возможно ли получение дескриптора именно того окна МТ, из которого была вызвана DLL?

Спасибо за ответы. 

Нет такой возможности. Только, если передавать, как параметр в функцию DLL.
Ilya Malev
10187
Ilya Malev 2013.04.27 12:37  
Zhunko:
Нет такой возможности. Только, если передавать, как параметр в функцию DLL.

А есть ли возможность получить этот дескриптор из MQL4 для передачи в DLL кроме как с помощью функции WindowHandle (т.е. в случае запуска из тестера без визуализации)?

Vadim Zhunko
5221
Vadim Zhunko 2013.04.27 13:30  
Ant_TL:

А есть ли возможность получить этот дескриптор из MQL4 для передачи в DLL кроме как с помощью функции WindowHandle (т.е. в случае запуска из тестера без визуализации)?

По заголовку окна только. И то, если такое окно одно. Будет несколько, то получишь дескриптор активного окна, если оно активно, или самого верхнего в Z-последовательности.

Библиотека. В ней есть решение для этого.

 Раздел "4.2. Функции для работы с окном графика".

Вы сами это можете сделать в DLL. 

Alexey Navoykov
3957
Alexey Navoykov 2013.04.27 19:27  
Ant_TLА есть ли возможность получить этот дескриптор из MQL4 для передачи в DLL кроме как с помощью функции WindowHandle (т.е. в случае запуска из тестера без визуализации)?
Ты не можешь получить хэндл окна, которого нет.
Ilya Malev
10187
Ilya Malev 2013.04.27 20:58  
Meat:
Ты не можешь получить хэндл окна, которого нет.

дескриптор окна вызвавшего DLL Метатрейдера

получение его с помощью функции WindowHandle предполагает определение родителя окна графика. 

Alexey Navoykov
3957
Alexey Navoykov 2013.04.27 21:22  
Ant_TL:

дескриптор окна вызвавшего DLL Метатрейдера

получение его с помощью функции WindowHandle предполагает определение родителя окна графика. 

А, так если тебе нужно получить окно самого МТ4, то нет проблем. Ищешь окно, чей Process Id совпадает с CurrentProcessId
Ilya Malev
10187
Ilya Malev 2013.04.27 21:28  
Meat:
А, так если тебе нужно получить окно самого МТ4, то нет проблем. Ищешь окно, чей Process Id совпадает с CurrentProcessId

Спасибо за совет. Не могли бы вы перечислить соответствующие функции WinAPI.

Alexey Navoykov
3957
Alexey Navoykov 2013.04.27 21:51  
Ant_TL:

Спасибо за совет. Не могли бы вы перечислить соответствующие функции WinAPI.

FindWindowEx и GetWindowProcessId
Ilya Malev
10187
Ilya Malev 2013.04.27 22:03  
Meat:
FindWindow и GetWindowProcessId

 Не нашел GetWindowProcessId, зато нашел

DWORD WINAPI GetWindowThreadProcessId(
  _In_       HWND hWnd,
  _Out_opt_  LPDWORD lpdwProcessId
);

Наверное это она?

 

И вторая функция

 DWORD WINAPI GetCurrentProcessId(void);


Т.е. как я понял, нужно делать перечисление окон с помощью EnumWindows, для каждого окна вызывать GetWindowThreadProcessId и сравнивать его с GetCurrentProcessId, пока не обнаружится совпадение. 

Alexey Navoykov
3957
Alexey Navoykov 2013.04.27 22:18  

ну да, можно через EnumWindows.

И кстати, помимо Id нужно проверять так же класс окна. У главного окна МТ4 там свой класс.  А иначе можно получить например хэндл окна ордера или ещё какое-то диалоговое окно МТ, находящееся в корневом уровне

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