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

 

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

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

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

 
Ant_TL:

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

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

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

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

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

 
Ant_TL:

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

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

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

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

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

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

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

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

 
Ant_TL:

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

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

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

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

 
Ant_TL:

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

FindWindowEx и GetWindowProcessId
 
Meat:
FindWindow и GetWindowProcessId

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

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

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

 

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

 DWORD WINAPI GetCurrentProcessId(void);


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

 

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

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

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