forked from airat77786/MQL5Book
101 lines
3.8 KiB
MQL5
101 lines
3.8 KiB
MQL5
//+------------------------------------------------------------------+
| |||
//| LibWindowTree.mq5 |
| |||
//| Copyright 2021-2022, MetaQuotes Ltd. |
| |||
//| https://www.mql5.com |
| |||
//+------------------------------------------------------------------+
| |||
| |||
#include <WinAPI/WinUser.mqh>
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Obtain window class name and title by handle |
| |||
//+------------------------------------------------------------------+
| |||
void GetWindowData(HANDLE w, string &clazz, string &title)
| |||
{
| |||
static ushort receiver[MAX_PATH];
| |||
if(GetWindowTextW(w, receiver, MAX_PATH))
| |||
{
| |||
title = ShortArrayToString(receiver);
| |||
}
| |||
if(GetClassNameW(w, receiver, MAX_PATH))
| |||
{
| |||
clazz = ShortArrayToString(receiver);
| |||
}
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Walk up through parent windows |
| |||
//+------------------------------------------------------------------+
| |||
HANDLE TraverseUp(HANDLE w)
| |||
{
| |||
HANDLE p = 0;
| |||
while(w != 0)
| |||
{
| |||
p = w;
| |||
string clazz, title;
| |||
GetWindowData(w, clazz, title);
| |||
Print("'", clazz, "' '", title, "'");
| |||
w = GetParent(w);
| |||
}
| |||
return p;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Walk down through child windows |
| |||
//+------------------------------------------------------------------+
| |||
HANDLE TraverseDown(const HANDLE w, const int level = 0)
| |||
{
| |||
HANDLE child = FindWindowExW(w, NULL, NULL, NULL); // get 1-st child window (if any)
| |||
while(child) // keep going while children exist
| |||
{
| |||
string clazz, title;
| |||
GetWindowData(child, clazz, title);
| |||
Print(StringFormat("%*s", level * 2, ""), "'", clazz, "' '", title, "'");
| |||
TraverseDown(child, level + 1);
| |||
child = FindWindowExW(w, child, NULL, NULL); // get next child window
| |||
}
| |||
return child;
| |||
}
| |||
| |||
//+------------------------------------------------------------------+
| |||
//| Script program start function |
| |||
//+------------------------------------------------------------------+
| |||
void OnStart()
| |||
{
| |||
// to get the main window could call
| |||
// FindWindowW("MetaQuotes::MetaTrader::5.00", NULL);
| |||
// or traverse up:
| |||
HANDLE h = TraverseUp(ChartGetInteger(0, CHART_WINDOW_HANDLE));
| |||
Print("Main window handle: ", h);
| |||
TraverseDown(h, 1);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
/*
| |||
| |||
'AfxFrameOrView140su' ''
| |||
'Afx:000000013F110000:b:0000000000010003:0000000000000006:00000000000306BA' 'EURUSD,H1'
| |||
'MDIClient' ''
| |||
'MetaQuotes::MetaTrader::5.00' '12345678 - MetaQuotes-Demo: Demo Account - Hedge - MetaQuotes Software Corp. - [EURUSD,H1]'
| |||
Main window handle: 263576
| |||
'msctls_statusbar32' 'For Help, press F1'
| |||
'AfxControlBar140su' 'Standard'
| |||
'ToolbarWindow32' 'Timeframes'
| |||
'ToolbarWindow32' 'Line Studies'
| |||
'ToolbarWindow32' 'Standard'
| |||
'AfxControlBar140su' 'Toolbox'
| |||
'Afx:000000013F110000:b:0000000000010003:0000000000000000:0000000000000000' 'Toolbox'
| |||
'AfxWnd140su' ''
| |||
'ToolbarWindow32' ''
| |||
...
| |||
'MDIClient' ''
| |||
'Afx:000000013F110000:b:0000000000010003:0000000000000006:00000000000306BA' 'EURUSD,H1'
| |||
'AfxFrameOrView140su' ''
| |||
'Edit' '0.00'
| |||
'Afx:000000013F110000:b:0000000000010003:0000000000000006:00000000000306BA' 'XAUUSD,Daily'
| |||
'AfxFrameOrView140su' ''
| |||
'Edit' '0.00'
| |||
'Afx:000000013F110000:b:0000000000010003:0000000000000006:00000000000306BA' 'EURUSD,M15'
| |||
'AfxFrameOrView140su' ''
| |||
'Edit' '0.00'
| |||
| |||
*/
| |||
//+------------------------------------------------------------------+
|