Как получить данные из списка Алертов. WinAPI - страница 2

 
Aleksei Stepanenko #:

Фёдор, там не по-простому. Поискал в загашниках, чуток подправил под ситуацию. Всё работает.

Большое спасибо за помощь! Сейчас попробовал, все работает!
 
Рад, что смог помочь
 

Это у вас с 4-кой получилось или таки с 5 ??

если рецепт для 5-ки, то стоит его утащить в копилку

PS/ вообще ужасно что программно недоступны Алерты, Окно Данных и к этому ещё журнал кешируется и прореживается

 
Maxim Kuznetsov #:

Это у вас с 4-кой получилось или таки с 5 ??

если рецепт для 5-ки, то стоит его утащить в копилку

PS/ вообще ужасно что программно недоступны Алерты, Окно Данных и к этому ещё журнал кешируется и прореживается

Это работает в четверке. В пятерке я не проверял.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Как получить данные из списка Алертов. WinAPI

Aleksei Stepanenko, 2021.11.08 01:00

Всё работает.

#property version   "1.00"
#property strict

#define LVM_GETITEMCOUNT 0x1004
#define LVIF_TEXT 0x0001
#define LVM_GETITEMTEXTA 0x102D
#define LVM_GETITEMA 0x1005

#import "user32.dll"
int FindWindowW(string a0, string a1);
int FindWindowExW(int hWndParent,int hWndChildAfter,string lpszClass,string lpszWindow);
int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
int SendMessageW(int hWnd,int Msg,int wParam,int lParam);
int CharPrevW(char &lpszStart[], char &lpszCurrent[]); // используем для получения адреса строки
int CharPrevW(int &lpszStart[],int &lpszCurrent[]); // используем для получения адреса массива целых чисел
#import

void OnStart()
   {
   Alert("AAA");
   Alert("BBB");
   Alert("CCC");
   
   
   int ha=0, eCount=0;
   do
      {
      ha=FindWindowW("#32770", "Алерт");
      eCount++;
      if(eCount>100) return;
      Sleep(100);
      }
   while(ha==0);
   int ht=FindWindowExW(ha,0,"SysListView32","List1");   

   char ch[540];
   for(int i=0; i<540; i++) ch[i]=0x000;

   int arr[9];
   arr[0]=LVIF_TEXT;          //маска, какие из оставшихся полей должны быть заполнены
   arr[1]=0;                  //индекс элемента
   arr[2]=1;                  //дополнительный индекс (колонка)
   arr[3]=0;                  //текущее состояние атрибутов
   arr[4]=0;                  //новое задаваемое состояние атрибутов
   arr[5]=CharPrevW(ch,ch);   //текст(указатель на строку) элемента
   arr[6]=128;                //размер буфера на который указывает pszText
   arr[7]=0;                  //индекс значка в списке изображений
   arr[8]=0;                  //32-битное значение, ассоциируемое с записью
   int LVITEM_addr=CharPrevW(arr,arr);
   
   int ItemsCount = SendMessageA(ht, LVM_GETITEMCOUNT, 0, 0);
   
   int hs;
   string stu;
   for (int i = 0; i < ItemsCount; i++)
      {
      arr[1]=i;
      for(int j=0; j<ArraySize(ch); j++) ch[j]=0x000;
      hs=SendMessageA(ht, LVM_GETITEMTEXTA, i, LVITEM_addr);
      stu="";
      
      
      for(int r=0; r<hs; r++) stu+=CharToString(ch[r]);
      printf(">>> "+(string)hs+" : "+stu);
      Sleep(100);
      }
   }
Это рабочий код для MT4-russian. Что поправить, чтобы стал работать под MT5?
 
fxsaber #:
FindWindowW

Попробуйте проверить подписи функций Windows. Посмотрите эту тему, пожалуйста:

https://www.mql5.com/en/forum/461014/page2#comment_51873405

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-findwindoww

Проверьте тип параметра LPCWSTR, он действительно требует ссылки.


int  FindWindowW(  string&  a0,  string&  a1); 

Это также справедливо для другого импорта. - Об этой ошибке сообщалось, как вы можете видеть в теме, которую я опубликовал.

Access Violation After GET Webpage - How to fix a problem with MT5 and find in MT5 files
Access Violation After GET Webpage - How to fix a problem with MT5 and find in MT5 files
  • 2024.01.23
  • www.mql5.com
Actually, it is the function signature definitions of the imported functions as they are defined in mt5 supplied files. Com/microsoft/win32metadata/issues/760. - so, in conclusion it should b e 64 bit. C++ type long is not platform type (x64 or x86), it is target depended type, which on windows is 32 bits integer and 64 bits on mingw
 
fxsaber #:
Это рабочий код для MT4-russian. Что поправить, чтобы стал работать под MT5?

В MT5 LVM_GETITEMTEXT не работает, так как у List-View выставлен стиль LVS_OWNERDATA.

 
Koldun Zloy #:

В MT5 LVM_GETITEMTEXT не работает, так как у List-View выставлен стиль LVS_OWNERDATA.

Спасибо. Судя по сообщениям на форуме, несколько человек имеют реализации получения того, что нужно.

К сожалению, поделиться не в состоянии.

 
Dominik Egert #:

Попробуйте проверить подписи функций Windows.

Спасибо. Основной вопрос не в получении хендла.
 

Мож немного не в тему😉: вот что выдал ИИ DeepSeek

В MQL5 нет прямого аналога функции  CharPrevW , которая использовалась в вашем исходном коде.

Вместо этого, в MQL5 для работы с строками используются стандартные функции, такие как  StringGetChar ,  StringSetChar ,  StringTrimRight  и другие.

Вот переписанный код на MQL5, который демонстрирует использование функций для работы со строками:

//+------------------------------------------------------------------+
//|                                                      OnStart.mq5 |
//|                        Copyright 2022, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property strict

// Функция для получения текста элемента ListView
string GetListViewItemText(int hListView, int index) {
   string itemText = "";
   int arr[9] = { LVIF_TEXT, index, 0, 0, 0, 0, 256, 0, 0 };
   SendDlgItemMessage(hListView, LVM_GETITEMTEXT, index, &arr);
   itemText = StringTrimRight(arr[5], ' '); // Удаляем лишние пробелы справа
   return itemText;
}

void OnStart() {
   Alert("AAA");
   Alert("BBB");
   Alert("CCC");

   int ha = 0, eCount = 0;
   do {
      ha = FindWindow("#32770", "Алерт");
      eCount++;
      if(eCount > 100) return;
      Sleep(100);
   } while(ha == 0);

   int ht = FindWindowEx(ha, 0, "SysListView32", "List1");

   int ItemsCount = SendDlgItemMessage(ht, LVM_GETITEMCOUNT, 0, 0);

   for (int i = 0; i < ItemsCount; i++) {
      string itemText = GetListViewItemText(ht, i);
      Print(">>> ", i, " : ", itemText);
      Sleep(100);
   }
}

В этом коде функция  GetListViewItemText  используется для получения текста элемента ListView по его индексу.

Обратите внимание, что в MQL5 нет необходимости выделять память для строк или массивов вручную,

так как MQL5 автоматически управляет памятью для строк и массивов.

Также обратите внимание, что в MQL5 для передачи массивов в функции или методы используется синтаксис  &arr , чтобы передать массив по ссылке. Это отличается от исходного кода на C++, где использовался указатель.

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