Вопрос по MQL4 + WinAPI (сменить название окна терминала)

 

Не получается сменить название окна терминала, выводится только первый символ из всей строки которую я передаю, в чем проблема?

 

#property copyright "Copyright"
#property link      "https://www.mql5.com/ru/users/avel08/seller"
#property version   "1.00"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "user32.dll"
int      GetForegroundWindow();
int      SetWindowTextA(int hWnd,string lpString);
#import

int h = GetForegroundWindow();
string Newname="abcdef";

//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return(rates_total);
}
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetMillisecondTimer(100);//кол-во мс в OnTimer()
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTimer()
{
   SetWindowTextA(h,Newname);
}
//+------------------------------------------------------------------+
 
Pavel Kolchin:

Не получается сменить название окна терминала, выводится только первый символ из всей строки которую я передаю, в чем проблема?

 

Дело в:

SetWindowTextA

Нужно заменить на

SetWindowsTextW

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

 
Ihor Herasko:

 SetWindowsTextW работает, теперь я пытаюсь получить предыдущий заголовок перед заменой функцией  GetWindowTextW, но показывает пустую строку

#import "user32.dll"
int      GetForegroundWindow();
int      SetWindowTextW(int hWnd,string lpString);
string   GetWindowTextW(int hWnd2,string lpString2, int co);
#import

string title;
string title_2 = GetWindowTextW(h,title,100);

int OnInit()
{
   Comment("\n\n\n>"+title+"|"+title_2+"|");
   return(INIT_SUCCEEDED);
}
 
Pavel Kolchin:

 SetWindowsTextW работает, теперь я пытаюсь получить предыдущий заголовок перед заменой функцией GetWindowTextW, но показывает пустую строку

Нужно распределить память для принимающей строки (она не должна быть пустой). GetWindowTextW не делает этого автоматически. Например, так:

string title = "                                                    ";
int symbolsCnt = GetWindowTextW(h,title,StringLen(title));
 
Ihor Herasko:

Все равно пусто, функция GetWindowTextW оставляет title таким же (не переписывает его)

#import "user32.dll"
int      GetForegroundWindow();
int      SetWindowTextW(int hWnd,string lpString);
int      GetWindowTextW(int hWnd2,string lpString2, int co);
#import

int h = GetForegroundWindow();

string title = "                                        ";
int symbolsCnt = GetWindowTextW(h,title,StringLen(title));

int OnInit()
{
   Comment("\n\n\n>"+title+"|"+symbolsCnt);
}
 
Pavel Kolchin:

Все равно пусто, функция GetWindowTextW оставляет title таким же (не переписывает его)

В этом случае не так уж все и просто. Нельзя давать в GetWindowTextW ссылку на строку MQL4. Нужно передать указатель на массив символов,  а массив символов преобразовывать в строку:

   #define SYMBOLS_UCHARS 50 
   ushort title[SYMBOLS_UCHARS];
   int symbolsCnt = GetWindowTextW(hSymbol, title, SYMBOLS_UCHARS);
   string windowName = ShortArrayToString(title);
   Print("Имя окна символа: ", windowName);

Соответственно, объявление GetWindowTextW должно быть таким:

int      GetWindowTextW(int hWnd2, ushort &lpString[], int co);
 
А почему после изменения названия окна стандартное название возвращается? Метаквоты сделали так, что оно периодически проверяется? Тратят ресурсы на такую фигню?
 
Alexey Viktorov:
А почему после изменения названия окна стандартное название возвращается? Метаквоты сделали так, что оно периодически проверяется? Тратят ресурсы на такую фигню?
Видимо, это не фигня, раз подобная проверка делается.
Причина обращения: