Вопрос по WinAPI - страница 2

 
Привет всем , ребята подскажите как отловить и нажать кнопку ОК , тоже пробовал разные варианты , не получается, тема - https://www.mql5.com/ru/forum/430125
 
SeriousRacoon #:

Лучше как-то так, не проверял в работе, но идея ясна, думаю.

Да. в таком виде работает, прям чётко!

//+------------------------------------------------------------------+
long FindThatFuckingCombo(long hParent)
  {
   long hResult = NULL;

   for(long hCtl = GetWindow(hParent, GW_CHILD); hCtl != NULL && hResult == NULL; hCtl = GetWindow(hCtl, GW_HWNDNEXT))
     {
      ushort szClassName[128];
      if(GetClassNameW(hCtl, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), "ComboBox") == 0)
        {
         long hFirstChild = GetWindow(hCtl, GW_CHILD);
         if(hFirstChild && GetClassNameW(hFirstChild, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), "Edit") == 0)
           {
            return hFirstChild;
           }
        }
      hResult = FindThatFuckingCombo(hCtl);
     }

   return hResult;
  }
//+------------------------------------------------------------------+
 
Sergii Krutyi #:
Привет всем , ребята подскажите как отловить и нажать кнопку ОК , тоже пробовал разные варианты , не получается, тема - https://www.mql5.com/ru/forum/430125

Блин. Я б подсказал, но сам не в теме. Если ответ появится, обязательно напишу.

У тебя МТ4, я даже поэкспериментировать не смогу :(

Проверил все сохранённые ссылки по форуму, касающиеся WinAPI , но судя по твоему коду, ты всё это уже читал)

 
Aleksandr Slavskii #:

Блин. Я б подсказал, но сам не в теме. Если ответ появится, обязательно напишу.

У тебя МТ4, я даже поэкспериментировать не смогу :(

Проверил все сохранённые ссылки по форуму, касающиеся WinAPI , но судя по твоему коду, ты всё это уже читал)

Ок , спасибо 

Да , по форуму тоже читал , все сводится к коду который указал , но почему он не работает ...вопрос 

 
Aleksandr Slavskii #:

Да. в таком виде работает, прям чётко!

А, возвращаете именно дескриптор едита. Можно и так, комбобокс всё равно получит уведомление EN_UPDATE от него после изменения текста.
 

Ну никак не получается , сделать так как хочется.

Вот такой код у меня получился, корявенький, но вроде как работает. Нужную вкладку "Параметры" открывает и сохраняет текущие настройки с новым именем.

Не получается изменить путь куда это добро будет сохраняться. Даже текст в окне ввода пути, изменить не получается. Мыша туда кликать из программы никак не хочет, как я ни пытался заставить её это сделать.

Вот собственно код. Подкрасил строку которая не хочет ничего менять.

#include <WinAPI\WinAPI.mqh>
#include <WinAPI\define.mqh>
HANDLE Handle;
//+------------------------------------------------------------------+
void OnStart()
  {
   string FileName = "File Name";
   string FolderName = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\Report";
   FolderClean("Report");
   FolderCreate("Report");
   Handle = GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);//хэндл главного окна

   IsSave(FolderName, FileName);
  }
//+------------------------------------------------------------------+
bool IsSave(string FolderName, string FileName = "File Name")
  {
   HANDLE handleMenu, handleID, handleDlg;
   int ControlID[] = {0xE81E, 0x804E, 0x2712}; // Spy++ ControlID, (0xE81E это инструменты)(0x804E это тестер стратегий), (0x2712 это строка - обзор, настройки, параметры,агенты..)
   handleID = GetHandle(Handle, ControlID);// нашли хэндл строки с "обзор, настройки, параметры,агенты.."

   SendMessageW(handleID, WM_LBUTTONDOWN, 1, 0xA00A0);//выбрали вкладку  0xB0100 - "Бэктест",  ControlID 0xA00AD кнопки "Параметры",  0x7005C - "Настройки"

   PostMessageW(Handle, WM_COMMAND, 33159, 0);// открыли форму сохранения файла, 33159 команда "сохранить" во вкладке параметры
//------
   handleID = 0;
   do
     {
      handleID = FindWindowW(NULL, "Сохранение"); // нашли форму сохранения файла
      //handleID = GetLastActivePopup(Handle);      // нашли форму сохранения файла
      if(handleID == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleID == 0);

//---находим строку с именем файла
   handleMenu = 0;
   do
     {
      handleMenu = FindThatFuckingCombo(handleID, "Edit"); //находим хэндл popup menu
      if(handleMenu == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleMenu == 0);

   SetWindowTextW(handleMenu, FileName); // ввели имя файла

   ushort Str[128];
   while(!IsStopped() && GetWindowTextW(handleMenu, Str, sizeof(Str) / sizeof(ushort)) == 0 && !StringCompare(ShortArrayToString(Str), FileName))
      Sleep(10);

//---находим адресную строку
   handleMenu = 0;
   do
     {
      handleMenu = FindThatFuckingButton(handleID, "WorkerW", "ReBarWindow32", "");
      int ControlID2[] = {0xA205, 0, 0, 0x3E9};
      handleMenu = GetHandle(handleMenu, ControlID2);// дескриптор адресной строки
      if(handleMenu == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleMenu == 0);

   SetWindowTextW(handleMenu, FolderName); //меняем текст в адресной строке??????????????????????????

//---
   handleDlg = GetDlgItem(handleID, 1);           //определяем дескриптор кнопки "Сохранить"
   PostMessageW(handleID, WM_COMMAND, 1, handleDlg);   //нажимаем на кнопку

// если появилось окно с подтверждением замены файла.
   handleDlg = 0;
   do
     {
      if(FindWindowW(NULL, "Сохранение") == 0)
         return(true);
      handleID = GetDlgItem(GetLastActivePopup(Handle), 0); // нашли последнее всплывающее окно
      handleDlg = FindThatFuckingButton(handleID, "CtrlNotifySink", "Button",  "&Да");
      if(handleDlg == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleDlg == 0);

   SendMessageW(handleDlg, WM_LBUTTONDOWN, 1, 0);
   Sleep(100);
   SendMessageW(handleDlg, BM_CLICK, 0, 0);

   return(true);
  }
//+------------------------------------------------------------------+
long GetHandle(long handleID, const int &ControlID[])
  {
   const int Size = ArraySize(ControlID);

   for(int i = 0; i < Size; i++)
      handleID = GetDlgItem(handleID, ControlID[i]);

   return(handleID);
  }
//+------------------------------------------------------------------+
long FindThatFuckingCombo(const long hParent, const string ClassName = "Edit")
  {
   long hResult = NULL;
   for(long hCtl = GetWindow(hParent, GW_CHILD); hCtl != NULL && hResult == NULL && !IsStopped(); hCtl = GetWindow(hCtl, GW_HWNDNEXT))
     {
      ushort szClassName[128];
      if(!IsStopped() && (GetClassNameW(hCtl, szClassName, sizeof(szClassName) / sizeof(ushort)) && StringCompare(ShortArrayToString(szClassName), ClassName) == 0))
         return hCtl;
      hResult = FindThatFuckingCombo(hCtl, ClassName);
     }
   return hResult;
  }
//+------------------------------------------------------------------+
long FindThatFuckingButton(const long hParent, const string ClassName1 = "CtrlNotifySink", const string ClassName2 = "Button", const string Text = "&Да")
  {
   long hResult = NULL;

   for(long hCtl = GetWindow(hParent, GW_CHILD); hCtl != NULL && hResult == NULL && !IsStopped(); hCtl = GetWindow(hCtl, GW_HWNDNEXT))
     {
      ushort szClassName[128];
      if(!IsStopped() && (GetClassNameW(hCtl, szClassName, sizeof(szClassName) / sizeof(ushort)) && StringCompare(ShortArrayToString(szClassName), ClassName1) == 0))
        {
         long hFirstChild = GetWindow(hCtl, GW_CHILD);
         if(!IsStopped() && (hFirstChild && GetClassNameW(hFirstChild, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), ClassName2) == 0))
            if(Text == "" || (hFirstChild && GetWindowTextW(hFirstChild, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), Text) == 0))
               return hFirstChild;
        }
     }

   return hResult;
  }
//+------------------------------------------------------------------+


define сообщений (или как их) вынес в отдельный файл, так как перебрал их тьму тьмущую, надоело каждый раз их в код вписывать.

Файлы:
define.mqh  51 kb
 
Aleksandr Slavskii #:

Ну никак не получается , сделать так как хочется.

Вот такой код у меня получился, корявенький, но вроде как работает. Нужную вкладку "Параметры" открывает и сохраняет текущие настройки с новым именем.

Не получается изменить путь куда это добро будет сохраняться. Даже текст в окне ввода пути, изменить не получается. Мыша туда кликать из программы никак не хочет, как я ни пытался заставить её это сделать.

Вот собственно код. Подкрасил строку которая не хочет ничего менять.


define сообщений (или как их) вынес в отдельный файл, так как перебрал их тьму тьмущую, надоело каждый раз их в код вписывать.

Так папку поменять не получится, комбо наверху - вообще не комбобокс, просто так выглядит.

Чтобы поменять папку, установите путь + "\" в комбо имени файла и нажмите ОК. Только надо подождать потом немного, пока оно папки развернёт.

 
SeriousRacoon #:

Так папку поменять не получится, комбо наверху - вообще не комбобокс, просто так выглядит.

Чтобы поменять папку, установите путь + "\" в комбо имени файла и нажмите ОК. Только надо подождать потом немного, пока оно папки развернёт.

Огромное спасибо!!! Наконец то получилось!!!

#include <WinAPI\WinAPI.mqh>
#include <WinAPI\define.mqh>
HANDLE Handle;
//+------------------------------------------------------------------+
void OnStart()
  {
   string FileName = "File Name";
   string FolderName = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\Report\\";
   FolderClean("Report");
   FolderCreate("Report\\" + FileName);

   Handle = GetAncestor(ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);//хэндл главного окна

   IsSave(FolderName, FileName);
  }
//+------------------------------------------------------------------+
bool IsSave(string FolderName, string FileName = "File Name")
  {
   HANDLE handleMenu, handleID, handleDlg;
   int ControlID[] = {0xE81E, 0x804E, 0x2712}; // Spy++ ControlID, (0xE81E это инструменты)(0x804E это тестер стратегий), (0x2712 это строка - обзор, настройки, параметры,агенты..)
   handleID = GetHandle(Handle, ControlID);// нашли хэндл строки с "обзор, настройки, параметры,агенты.."

   SendMessageW(handleID, WM_LBUTTONDOWN, 1, 0xA00A0);//выбрали вкладку  0xB0100 - "Бэктест",  ControlID 0xA00AD кнопки "Параметры",  0x7005C - "Настройки"

   PostMessageW(Handle, WM_COMMAND, 33159, 0);// открыли форму сохранения файла, 33159 команда "Сохранить" во вкладке параметры,  33160 "Открытие"(загрузить)
//------
   handleID = 0;
   do
     {
      handleID = FindWindowW(NULL, "Сохранение"); // нашли форму сохранения файла
      //handleID = GetLastActivePopup(Handle);      // нашли форму сохранения файла
      if(handleID == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleID == 0);

//---находим строку с именем файла
   handleMenu = 0;
   do
     {
      handleMenu = FindThatFuckingCombo(handleID, "Edit"); //находим хэндл popup menu
      if(handleMenu == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleMenu == 0);

   SetWindowTextW(handleMenu, FolderName + FileName + "\\" + FileName);
//---
   handleDlg = GetDlgItem(handleID, 1);           //определяем дескриптор кнопки "Сохранить"
   PostMessageW(handleID, WM_COMMAND, 1, handleDlg);   //нажимаем на кнопку

// если появилось окно с подтверждением замены файла.
   handleDlg = 0;
   do
     {
      if(FindWindowW(NULL, "Сохранение") == 0)
         return(true);
      handleID = GetDlgItem(GetLastActivePopup(Handle), 0); // нашли последнее всплывающее окно
      handleDlg = FindThatFuckingButton(handleID, "CtrlNotifySink", "Button",  "&Да");
      if(handleDlg == 0)
         Sleep(10);
     }
   while(!IsStopped() && handleDlg == 0);

   SendMessageW(handleDlg, WM_LBUTTONDOWN, 1, 0);
   Sleep(100);
   SendMessageW(handleDlg, BM_CLICK, 0, 0);

   return(true);
  }
//+------------------------------------------------------------------+
long GetHandle(long handleID, const int &ControlID[])
  {
   const int Size = ArraySize(ControlID);

   for(int i = 0; i < Size; i++)
      handleID = GetDlgItem(handleID, ControlID[i]);

   return(handleID);
  }
//+------------------------------------------------------------------+
long FindThatFuckingCombo(const long hParent, const string ClassName = "Edit")
  {
   long hResult = NULL;
   for(long hCtl = GetWindow(hParent, GW_CHILD); hCtl != NULL && hResult == NULL && !IsStopped(); hCtl = GetWindow(hCtl, GW_HWNDNEXT))
     {
      ushort szClassName[128];
      if(!IsStopped() && (GetClassNameW(hCtl, szClassName, sizeof(szClassName) / sizeof(ushort)) && StringCompare(ShortArrayToString(szClassName), ClassName) == 0))
         return hCtl;
      hResult = FindThatFuckingCombo(hCtl, ClassName);
     }
   return hResult;
  }
//+------------------------------------------------------------------+
long FindThatFuckingButton(const long hParent, const string ClassName1 = "CtrlNotifySink", const string ClassName2 = "Button", const string Text = "&Да")
  {
   long hResult = NULL;

   for(long hCtl = GetWindow(hParent, GW_CHILD); hCtl != NULL && hResult == NULL && !IsStopped(); hCtl = GetWindow(hCtl, GW_HWNDNEXT))
     {
      ushort szClassName[128];
      if(!IsStopped() && (GetClassNameW(hCtl, szClassName, sizeof(szClassName) / sizeof(ushort)) && StringCompare(ShortArrayToString(szClassName), ClassName1) == 0))
        {
         long hFirstChild = GetWindow(hCtl, GW_CHILD);
         if(!IsStopped() && (hFirstChild && GetClassNameW(hFirstChild, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), ClassName2) == 0))
            if(Text == "" || (hFirstChild && GetWindowTextW(hFirstChild, szClassName, 128) && StringCompare(ShortArrayToString(szClassName), Text) == 0))
               return hFirstChild;
        }
     }

   return hResult;
  }
//+------------------------------------------------------------------+