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

 
HeAic #:

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

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

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

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

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

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

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

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

1. Ваще не в тему. CharPrevW там используется не для работы со строками, а для получения адреса.

2. Вы свой код даже проверить не удосужились. У функции SendDlgItemMessage  5 аргументов. Адрес буфера Вы не передаёте.

3. И не надо учить людей плохому. Нет никакой необходимости передавать вместо структуры массив.

Вот правильный код:

#define _WIN64  // Only for a 64-bit terminal!

#include <WinDef.mqh>

#ifdef __MQL5__
struct LVITEM pack( sizeof( PVOID ) )
#else
struct LVITEM
#endif
{
    UINT mask;
    int iItem;
    int iSubItem;
    UINT state;
    UINT stateMask;
    PVOID pszText;
    int cchTextMax;
    int iImage;
    LPARAM lParam;
    int iIndent;
    int iGroupId;
    UINT cColumns; // tile view columns
    PUINT puColumns;
    PVOID piColFmt;
    int iGroup; // readonly. only valid for owner data.
};

#define LVM_GETITEMCOUNT 0x1004
#define LVM_GETITEMTEXT 0x1073
#define LVIF_TEXT 1

#define HRESULT uint
#define S_OK 0

#import "user32.dll"
   HWND FindWindowW( string lpClassName, string lpWindowName );
   HWND FindWindowExW( HWND hwndParent, HWND hwndChildAfter, string lpszClass, PVOID lpszWindow );
   LRESULT SendMessageW( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
   LRESULT SendMessageW( HWND hWnd, UINT Msg, WPARAM wParam, LVITEM& lvItem );
#import "Kernel32.dll"
   DWORD GetLastError();
   
#import "OleAut32.dll"
   HRESULT VarI4FromUI4( const ushort& var, uint& plOut );
   HRESULT VarI4FromUI4( const uint& var, uint& plOut );
   HRESULT VarI4FromUI4( const string& var, uint& plOut );
   HRESULT VarI8FromUI8( const ushort& var, ulong& plOut );
   HRESULT VarI8FromUI8( const uint& var, ulong& plOut );
   HRESULT VarI8FromUI8( const string& var, ulong& plOut );
#import

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   Alert( "AAA" );
   Alert( "BBB" );
   Alert( "CCC" );
   
   int count = 0;
   HWND hAlert = 0;
   
   do{
      hAlert = FindWindowW( "#32770", "Алерт" );
      
      if( ++count > 10 )return;
      
      Sleep( 100 );
   }
   while( hAlert == 0 );
   
   HWND hListView = FindWindowExW( hAlert, 0, "SysListView32", 0 );
   
   int itemCount = (int)SendMessageW( hListView, LVM_GETITEMCOUNT, 0, 0 );
   
   Print( "itemCount = ", itemCount );
   
   ushort buffer[100];
   buffer[0] = 0;
   
   LVITEM lvItem = {0};
   lvItem.mask = LVIF_TEXT;
   lvItem.iSubItem = 1;
   lvItem.pszText = AddressOf( buffer[0] );
   lvItem.cchTextMax = 100;
   
   for( int i = 0; i < itemCount; i++ ){
      uint numChars = (uint)SendMessageW( hListView, LVM_GETITEMTEXT, i, lvItem );
      Print( "numChars = ", numChars );
      
      if( numChars > 0 ){
         string text = ShortArrayToString( buffer, 0, numChars );
         Print( "text = ", text );
      }
      else {
         uint error = Kernel32::GetLastError();
         Print( "error = ", error );
      }
   }
}
//+------------------------------------------------------------------+
template< typename Type >
PVOID AddressOf( const Type& data )
{
   PVOID lOut;
#ifdef _WIN64
   HRESULT result = VarI8FromUI8( data, lOut );
#else
   HRESULT result = VarI4FromUI4( data, lOut );
#endif
   if( result == S_OK ){
      return lOut;
   }
   return 0;
}
//+------------------------------------------------------------------+

Но в MT5 он не работает из-за LVS_OWNERDATA.

Файлы:
WinDef.mqh  2 kb
 
Нет ни у кого решения для МТ5? Очень нужно... только не Alerts, а Journal прочитать.
 
Dmitry Zhakov #:
Нет ни у кого решения для МТ5? Очень нужно... только не Alerts, а Journal прочитать.

Скопировать из журнала в папку Files и работать с ним средствами MQL

 
Aleksandr Slavskii #:

Скопировать из журнала в папку Files и работать с ним средствами MQL

Неплохая идея. Но для начала нужно дать команду на сброс журналов в файл (аналог "Открыть" контекстного меню в соответствующе вкладке). Без этого ничего не получится.

 
Ihor Herasko #:

Неплохая идея. Но для начала нужно дать команду на сброс журналов в файл (аналог "Открыть" контекстного меню в соответствующе вкладке). Без этого ничего не получится.

Хорошо вот.

 
Aleksandr Slavskii #:

Хорошо вот.

Движемся )) Осталось лишь программно открыть вкладку "Журнал".