Нажать кнопку ОК

 

Добрый день ,

Подскажите пожа-ста , цепляю программно индикатор на чарт , появляется Диалоговое окно настроек , как нажать кнопку ОК ?

 #import "user32.dll"
int RegisterWindowMessageW(string MessageName);
int GetAncestor(int hWnd, int gaFlags);
int PostMessageW(int hwnd,int msg,int wparam,uchar &Name[]);
int  FindWindowW(string lpszClass,string lpszWindow);
int GetLastActivePopup(int hWnd);
int GetDlgItem(int hDlg, int nIDDlgItem);
#import

#include <WinUser32.mqh>

void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=true)
  {
   uchar name2[];
   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));
  //Print("name2[] : ",CharArrayToString(name2));
   int MessageNumber=RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int r=PostMessageW(hWnd,MessageNumber,15,name2);
    //int ind_settings = FindWindowW(NULL, "Custom Indicator - "+IndicatorName);
  int hMetaTrader, hDlg,  hChart = WindowHandle(Symbol(),Period());
   hMetaTrader = GetAncestor(hChart,2);
   hDlg = GetLastActivePopup(hWnd); 
   uint hButtonOk = GetDlgItem(hDlg, 1);  //дескриптор кнопки "Ok"
        
   PostMessageA(hDlg, WM_COMMAND, 1, hButtonOk); //нажимаем кнопку Ok
   
   
   
   Sleep(10);
   
  }

пробовал такой вариант но не нажимает 

 
Sergii Krutyi:

Добрый день ,

Подскажите пожа-ста , цепляю программно индикатор на чарт , появляется Диалоговое окно настроек , как нажать кнопку ОК ?

пробовал такой вариант но не нажимает 

PostMessageW(hWnd,MessageNumber,15,name2);
кидает сообщение в очередь и тут же возвращается. Т.е. окно ещё не открылось, а вы уже ищете его и нажимаете кнопки. Возможно, лучше всего будет поставить таймер и в нём всё, что ниже этой строки отрабатывать (если hButtonOk не ноль - посылаем сообщение на закрытие и убиваем таймер). Но это вопрос реализации скриптов и индикаторов в четвёрке - в отдельном потоке или нет, я уже не помню.
 

Вот так индикатор присоединяется:

void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=true)
{
   uchar name2[];
   StringToCharArray(IndicatorName,name2,0,StringLen(IndicatorName));
   int MessageNumber=RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int r=PostMessageW(hWnd,MessageNumber,15,name2);
   
   int hDialogWnd = 0;
   
   while (!IsStopped() && !hDialogWnd)
   {
      hDialogWnd = FindWindowW(NULL, "Custom Indicator - " + IndicatorName);
      Sleep(1);
   }
   
   uint uButtonOK = GetDlgItem(hDialogWnd, 1);
   PostMessageA(hDialogWnd, WM_COMMAND, 1, uButtonOK); //нажимаем кнопку Ok
} 
 
Ihor Herasko #:

Вот так индикатор присоединяется:

Большое спасибо !!! да , в таком виде работает 

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