Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Знаете ли вы, что в MQL5 появились классы?
Pavel Kolchin
1081
Pavel Kolchin 2016.07.26 09:56 

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

 

#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);
}
//+------------------------------------------------------------------+
Ihor Herasko
9041
Ihor Herasko 2016.07.26 10:05  
Pavel Kolchin:

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

 

Дело в:

SetWindowTextA

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

SetWindowsTextW

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

Pavel Kolchin
1081
Pavel Kolchin 2016.07.26 12:02  
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);
}
Ihor Herasko
9041
Ihor Herasko 2016.07.26 12:14  
Pavel Kolchin:

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

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

string title = "                                                    ";
int symbolsCnt = GetWindowTextW(h,title,StringLen(title));
Pavel Kolchin
1081
Pavel Kolchin 2016.07.26 12:48  
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);
}
Ihor Herasko
9041
Ihor Herasko 2016.07.26 13:21  
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
6823
Alexey Viktorov 2016.07.26 19:37  
А почему после изменения названия окна стандартное название возвращается? Метаквоты сделали так, что оно периодически проверяется? Тратят ресурсы на такую фигню?
Ihor Herasko
9041
Ihor Herasko 2016.07.26 20:23  
Alexey Viktorov:
А почему после изменения названия окна стандартное название возвращается? Метаквоты сделали так, что оно периодически проверяется? Тратят ресурсы на такую фигню?
Видимо, это не фигня, раз подобная проверка делается.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий