Скачать MetaTrader 5

Как получить дескриптор окна

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

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

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

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

Vadim Zhunko
5226
Vadim Zhunko  
Ant_TL:

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

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

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

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

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

Vadim Zhunko
5226
Vadim Zhunko  
Ant_TL:

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

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

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

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

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

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

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

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

Alexey Navoykov
4920
Alexey Navoykov  
Ant_TL:

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

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

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

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

Alexey Navoykov
4920
Alexey Navoykov  
Ant_TL:

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

FindWindowEx и GetWindowProcessId
Ilya Malev
11698
Ilya Malev  
Meat:
FindWindow и GetWindowProcessId

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

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

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

 

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

 DWORD WINAPI GetCurrentProcessId(void);


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

Alexey Navoykov
4920
Alexey Navoykov  

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

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

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