Как блокировать закрытие терминала ? - страница 4

 
LEOK:


Так и не удалось пока библиотеку user32.lib подцепить к МТ4 !

Не может МТ4 загрузить данную библиотеку.

#import "user32.lib"
int SetWindowLong (int,int,int);
#import

#import "user32.dll"
 int SetWindowLong (int,int,int);
#import
Это если в MQL4.
 

В user32.lib функции SetWindowLong нет.

В ней найдены только функции: SetWindowLongA и SetWindowLongW.

Но, для их применения: требуется рабочий пример !

Файлы:
xrrvtxp.mq4  2 kb
 
LEOK:

В user32.lib функции SetWindowLong нет.

В ней найдены только функции: SetWindowLongA и SetWindowLongW.

Но, для их применения: требуется рабочий пример !

SetWindowLong() - это не функция. Это макрос.
 
Zhunko:
SetWindowLong() - это не функция. Это макрос.


Мне от этого не легче (как он называется) !

Суть в том, что пока я не понял, как его применить на практике, он(а) для меня тёмная лошадка !

ПС:

Может когда-то и дождусь помощи в практическом его применении, но пока видимо время не пришло ...

 

Это к тому, что SetWindowLong() в библиотеке нет. Она есть только в заголовочном файле.

Надо дескриптор окна МТ4 искать от окна графика, а не от рабочего стола.

Есть такая библиотека. Там есть функция, которая возвращает дескриптор окна МТ4.

Если хотите, допишу туда функцию, которая меняет стиль окна.

 
Zhunko:

Это к тому, что SetWindowLong() в библиотеке нет. Она есть только в заголовочном файле.

Надо дескриптор окна МТ4 искать от окна графика, а не от рабочего стола.

Есть такая библиотека. Там есть функция, которая возвращает дескриптор окна МТ4.

Если хотите, допишу туда функцию, которая меняет стиль окна.


Ну а чем не понравился мой метод нахождения дескриптора ?
Ведь дескриптор головного окна МТ4 он находит и печатает правильно !!!

Другое дело, как после того, как дескриптор найден, изменить стиль окна ?

 
Если терминалов много, то получите первый попавшийся. И не обязательно это будет Ваш.
 
Zhunko:
Если терминалов много, то получите первый попавшийся. И не обязательно это будет Ваш.

Но, так дольше !

Хотя всего на один шаг ...

#property copyright "Copyright © 2012 ЛЕО"
string      s     = "MetaQuotes::MetaTrader::4.00";    // название класса окна МТ4
string      c;    // заголовок окна MT4

#import "user32.dll" 
      int   GetDesktopWindow        ();
      int   GetWindow               (int, int);
      int   FindWindowExA           (int, int, string, string);
      int   SetWindowLong           (int,int,int);
      int   GetParent               (int hWnd); 
#import

int start() {
      int         Wnd   = GetDesktopWindow();          // дескриптор Рабочего стола
      int         temp  = GetWindow (Wnd, 5);          // переходим в дочерние окна
      int         h     = FindWindow(temp, s, c);      // поиск дескриптора окна МТ4
      Print ("Дескриптор МТ4: ",DecToHex(h,8));
      int hg = WindowHandle(Symbol(),0);
      Print ("Дескриптор графика: ",DecToHex(hg,8));
      int phg = GetParent(hg);
      Print ("Дескриптор родителя: ",DecToHex(phg,8));
      int dhg = GetParent(phg);
      Print ("Дескриптор деда: ",DecToHex(dhg,8));
      int h1 = GetParent(dhg);
      Print ("Дескриптор МТ:   ",DecToHex(h1,8));
      //SetWindowLong (h,-16,0);
      return(0);
}
  
int FindWindow(int hw, string class, string caption) {    
      int h = FindWindowExA (0,hw,class,caption);
      return (h);
}

string DecToHex (int n, int dig) {
      string s[], r="";
      string Sym[16] = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
   
      ArrayResize (s,dig);
      for (int i=0; i<dig; i++) s[i]="0";
      i = dig-1;
      while (n != 0) {
            s[i] = Sym[n%16]; 
            n = n>>4;
            i--;
      }
      for (i=0; i<dig; i++) r=r+s[i];
   
      return (r);
} 
 
        int Style;
        Style = GetWindowLongA(hWnd,GWL_STYLE);
        Style=Style || WS_CAPTION;
        Style=Style || WS_SYSMENU;
        SetWindowLongA(hWnd, GWL_STYLE, Style);
 

Есть ещё идея (частично в эту тему). Восстанавливать работу терминала, если его работа была завершена по каким-либо причинам. Самый простейший пример - в прикреплённом файле. Каждые 10 секунд программа ищет в списке запущенных процессов процесс терминала, если не находит, то запускает его.
Попытка "убить" терминал при работе такой программы приведёт к его запуску в течение 10-15 секунд.

Файлы:
pastuh.zip  7 kb
Причина обращения: