как програмно(MQL) определить активное окно инструмента? - страница 2

 
vvavva >>:

как програмно(MQL) определить активное окно инструмента?

если к примеру активно окно евро/дол то на вопрос советника(который присоеденён к дол/франк) какой инструмент активен,

получаем ответ "EURUSD" !?

Если использовать функции WinAPI, то задачу можно решить следующим образом:

#import "user32.dll"
  int GetAncestor(int hWnd, int gaFlags);
  int GetDlgItem(int hDlg, int nIDDlgItem);
  int SendMessageA(int hWnd, int Msg, int wParam, int lParam);
  int GetWindowTextA(int hWnd, string lpString, int nMaxCount);
  int GetWindowTextLengthA(int hWnd);
#import

void start()
{
   Print(GetNameActiveChart());
}

string GetNameActiveChart()
{
   int hTerminalWnd, hMDIClientWnd, hMDIActiveWnd, nMaxCount;
   string sActiveChartName = "                             ";
//---- определяем системный дескриптор основного окна терминала
   hTerminalWnd = GetAncestor(WindowHandle(Symbol(), Period()), 2);
//---- определяем системный дескриптор активного окна
   hMDIClientWnd = GetDlgItem(hTerminalWnd, 0xE900);
   hMDIActiveWnd = SendMessageA(hMDIClientWnd, 0x0229, 0, 0);
//---- считываем текст из заголовка активного окна
   nMaxCount = GetWindowTextLengthA(hMDIActiveWnd);
   GetWindowTextA(hMDIActiveWnd, sActiveChartName, nMaxCount+1);
//----
   return(sActiveChartName);
}

Функция GetNameActiveChart() возвращает имя активного окна в формате symbol,period (н-р, EURUSD,H1).


P.S. Для работы функции GetNameActiveChart() необходимо разрешить вызов функций

из системных DLL: Сервис -> Настройки -> Советники -> Разрешить импорт DLL.

 

а ваще то топикстартер ленивец.. базу скриптов смотреть нада

'Interception'

#property copyright "Viatcheslav Suvorov"
#property show_inputs
#include 
 
#import "IdleLib.dll"
int GetLastKeyWP();
int GetLastMouseWP();
int IdleLibInit();
int IdleLibUnInit();
string GetActiveWndName();
#import
 
int start()
  {
        IdleLibInit();//инициализируем Dll для перехвата событий   
         bool NeedLoop=true;  
         string predwnd='';
         while(NeedLoop){           
          // int lastkey=GetLastKeyWP();//Опрашиваем код посл. клавиши
          // int lastmouse=GetLastMouseWP();//Опрашиваем код мыши           
           string lastwnd=GetActiveWndName();//Имя окна Metatrader где произошло событие
           if ((predwnd!=lastwnd) && lastwnd!="") {             
             Print("Активное окно ",lastwnd);
             predwnd=lastwnd;             
           } else {
            // Print("Активное окно ",predwnd);
            //активное окно не изменилось
           }  
           
           Sleep(100);
         }//while                
   return(0);
  }
 
void deinit()
  {
   IdleLibUnInit();
  }

строку 

string lastwnd=GetActiveWndName();//Имя окна Metatrader где произошло событие
можно заменить на   string lastwnd=StringSubstr(GetActiveWndName(),0,6);


ответить

 

всем сенкую за помощь!

мож моё рукоделие комунить пригодится!

////////////////////////////////////////////////////////
//= тест поиск окна
int Set_TestWindow()
{
  int pn=0;
  int phwnd=0;
  int pCount=0;
  string psFileName="_TestWindow.txt";
  string ps,ps2="";
  int pLengthBuf=0;
  string psBuf="GetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindowGetDesktopWindow";
  int pStringLen=0;
  
  phwnd = GetDesktopWindow();
  if(phwnd>0)
  {
    ps=phwnd;
    //= запись информации в файл
    Set_FileWrite(
      ps // строка
      ,psFileName //имя файла
      ,1 //показатель 1-перезаписать файл/0-дописать
      );
    
    phwnd = GetWindow(phwnd, GW_CHILD);
    while(phwnd !=0)
    {
      phwnd = GetWindow(phwnd, GW_HWNDNEXT);
      if(phwnd !=0)
      {
        pLengthBuf=GetWindowTextLengthA(phwnd);
        if(pLengthBuf>0)
        {
          
          pn= GetWindowTextA(phwnd,psBuf,pLengthBuf+1);
          
          ps=pLengthBuf;
          if(pn>0)
          {
            
            pStringLen=StringLen(psBuf);
            ps2=pStringLen;
            ps=ps + " - " + ps2 + " - " + psBuf;
            
            
          }
          else ps=ps+" - ошибка" ;
          
          //= запись информации в файл
          Set_FileWrite(
            ps // строка
            ,psFileName //имя файла
            ,0 //показатель 1-перезаписать файл/0-дописать
            );
          
          //-поиск символа-----------------------------------------------
          string psFind=": MetaTrader";
          int pPos= StringFind(psBuf,psFind,0);
          if(pPos> -1)
          {
            pPos= StringFind(psBuf,"[",0);
            if(pPos > -1)
            {
              int pPos2= StringFind(psBuf,"]",0);
              if(pPos2 > -1)
              {
                int plength=pPos2-pPos;
                if(plength>0)
                {
                  string pSubstr=
                    StringSubstr(psBuf,pPos,plength+1);
                  //= запись информации в файл
                  Set_FileWrite(
                    "строка= " + pSubstr // строка
                    ,psFileName //имя файла
                    ,0 //показатель 1-перезаписать файл/0-дописать
                    );
                  
                  pPos= StringFind(pSubstr,"[",0);
                  pPos2= StringFind(pSubstr,",",0);
                  if(pPos > -1 && pPos2 > -1)
                  {
                    plength=pPos2-pPos;
                    if(plength>1)
                    {
                      string pSubstr2=
                        StringSubstr(pSubstr,pPos+1,plength-1);
                      //= запись информации в файл
                      Set_FileWrite(
                        "символ= >" + pSubstr2 + "<" // строка
                        ,psFileName //имя файла
                        ,0 //показатель 1-перезаписать файл/0-дописать
                        );
                      
                    }
                  }
                  
                  break;
                }
              }
            }
          }
          
        }
        pCount++;
      }
    }
    
    ps=pCount;
    //= запись информации в файл
    Set_FileWrite(
      "количество= " + ps // строка
      ,psFileName //имя файла
      ,0 //показатель 1-перезаписать файл/0-дописать
      );
    
  }
  
  return (pn);
} //------------------------------------------------
 
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
int      GetParent(int h);
  int GetAncestor(int hWnd, int gaFlags);
int      GetTopWindow(int h);
bool  GetCursorPos   ( int& Pos[] );
int   WindowFromPoint( int x, int y );
#import
int Mouse[2];
int WFP;
int start()
  {
//----
Print("Символ активен = "+isActive());
Print("Терминал активен = "+TerminalActivCursor());
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool isActive(){
   int hCurrWindow = WindowHandle(Symbol(),Period());    //хедл текущего окна графика
   int hNextParent = GetParent(hCurrWindow);
   hNextParent = GetParent(hNextParent);                 //хендп родительского окно для всех графиков
   int hNextActiveWindow = GetTopWindow(hNextParent);
   hNextActiveWindow = GetTopWindow(hNextActiveWindow);  //хедл текущего окна графика
   if (hCurrWindow==hNextActiveWindow) return(true);
   else return(false); 
}
bool TerminalActivCursor()
{
int hTerminalWnd = GetAncestor(WindowHandle(Symbol(), Period()), 2);
GetCursorPos(Mouse);
WFP = WindowFromPoint( Mouse[0], Mouse[1] );
int cTerminalWnd = GetAncestor(WFP, 2);
if(hTerminalWnd==cTerminalWnd) return(true);
else return(false);
}
Мож кому пригодится.
 
thekoss Karakozov:
Мож кому пригодится.

Спасибо.
Это полезная функция.

 
Ilnur Iksanov:

Если использовать функции WinAPI, то задачу можно решить следующим образом:

Функция GetNameActiveChart() возвращает имя активного окна в формате symbol,period (н-р, EURUSD,H1).


P.S. Для работы функции GetNameActiveChart() необходимо разрешить вызов функций

из системных DLL: Сервис -> Настройки -> Советники -> Разрешить импорт DLL.

Эта фкнкция в современном терминале не работает.
Постоянно возвращается начальное значение строки.

 

Этому вопросу ДВЕНАДЦАТЬ лет. А этой функции девять… За это время терминал и язык MQL4 изменился до неузнаваемости и вряд-ли кому это пригодится.

Не так давно этот вопрос обсуждали… поищите CHART_BRING_TO_TOP и будет вам счастье…

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