AM2
Андрей

 
Уровень 35

  Торгую в компаниях:


Группа "Программирование на MQL"

Рейтинг 280



Запускаем стороннее приложение и выключаем компьютер с помощью средств MQL

Если нам необходимо запустить другой терминал, любую другую программу, открыть текстовый файл, выключить компьютер в определенное время, здесь нам поможет функция WinAPIShellExecute.

Синтаксис функции:



hWnd – идентификатор родительского окна. Указывать родительское окно не обязательно, можно просто 0
lpOperation – операция выполняемая с файлом. Может иметь следующие значения: «open» — открыть файл (папку), «print» — печатать текстовой документ, «explore»
lpFile – файл или папка, которую нужно открыть
lpParameters – параметры открытия файла, т.ч. запуска приложения. Используется только при запуске приложений
lpDirectory – рабочая директория
nShowCmd – параметры окна открытого файла (приложения, директории)

Параметр nShowCmd может иметь одно из следующих значений:

SW_SHOWMAXIMIZED (3) — развернутое окно;
SW_SHOWMINIMIZED (2) — свернутое окно в панель задач;
SW_SHOWNORMAL (1) — нормальное окно.

Все параметры:

hwnd [in, optional]
Тип: HWND

Ручка родительского окна, используемая для отображения пользовательского интерфейса или сообщений об ошибках. Это значение может быть NULL, если операция не связана с окном.

lpOperation [in, optional]
Тип: LPCTSTR

Указатель на нуль- терминированную строку, обозначаемую в этом случае как глагол, который указывает действие, которое необходимо выполнить. Набор доступных глаголов зависит от конкретного файла или папки. Как правило, действия, доступные из контекстного меню объекта, — это доступные глаголы. Обычно используются следующие глаголы:

edit

Запускает редактор и открывает документ для редактирования. Если lpFile не является файлом документа, функция завершится с ошибкой.

explore

Исследует папку, указанную lpFile.

find

Инициирует начало поиска в каталоге, указанном lpDirectory.

open

Открывает элемент, указанный параметром lpFile. Элемент может быть файлом или папкой.

print

Распечатывает файл, указанный lpFile. Если lpFile не является файлом документа, функция не работает.

NULL

Глагол по умолчанию используется, если он доступен. Если нет, используется «открытый» глагол. Если ни один из глаголов не доступен, система использует первый глагол, указанный в реестре.

lpFile [in]
Тип: LPCTSTR

Указатель на строку с нулевой ошибкой, которая указывает файл или объект, на котором выполняется указанный глагол. Чтобы указать объект пространства имен Shell, передайте полное имя синтаксического анализа. Обратите внимание, что не все глаголы поддерживаются на всех объектах. Например, не все типы документов поддерживают «печатный» глагол. Если относительный путь используется для параметра

lpDirectory, не используйте относительный путь для lpFile.
lpParameters [in, optional]

Тип: LPCTSTR
Если lpFile указывает исполняемый файл, этот параметр является указателем на строку с нулевой ошибкой, которая указывает параметры, которые должны быть переданы приложению. Формат этой строки определяется глаголом, который должен быть вызван. Если lpFile указывает файл документа, lpParameters должен быть NULL.

lpDirectory [in, optional]
Тип: LPCTSTR

Указатель на строку с нулевой ошибкой, которая указывает рабочий (рабочий) каталог для действия. Если это значение равно NULL, используется текущий рабочий каталог. Если относительный путь указан в lpFile, не используйте относительный путь для lpDirectory.

nShowCmd [in]
Тип: INT

Флаги, которые определяют, как приложение должно отображаться при его открытии. Если lpFile указывает файл документа, флаг просто передается соответствующему приложению. Решать, как с этим обращаться, зависит от приложения. Эти значения определены в Winuser.h.

SW_HIDE (0)
Скрывает окно и активирует другое окно.

SW_MAXIMIZE (3)
Максимизирует указанное окно.

SW_MINIMIZE (6)
Минимизирует указанное окно и активирует следующее окно верхнего уровня в z-порядке.

SW_RESTORE (9)
Активирует и отображает окно. Если окно минимизировано или максимизировано, Windows восстанавливает его исходный размер и положение. Приложение должно указывать этот флаг при восстановлении свернутого окна.

SW_SHOW (5)
Активирует окно и отображает его в текущем размере и положении.

SW_SHOWDEFAULT (10)
Устанавливает состояние отображения на основе флага SW_, указанного в структуре STARTUPINFO, переданной функции CreateProcess программой, которая запускала приложение. Приложение должно вызвать ShowWindow с этим флагом, чтобы установить начальное состояние отображения его главного окна.

SW_SHOWMAXIMIZED (3)
Активирует окно и отображает его как максимально развернутое окно.

SW_SHOWMINIMIZED (2)
Активирует окно и отображает его как свернутое окно.

SW_SHOWMINNOACTIVE (7)
Отображает окно как свернутое окно. Активное окно остается активным.

SW_SHOWNA (8)
Отображает окно в текущем состоянии. Активное окно остается активным.

SW_SHOWNOACTIVATE (4)
Отображает окно в его последнем размере и позиции. Активное окно остается активным.

SW_SHOWNORMAL (1)
Активирует и отображает окно. Если окно минимизировано или максимизировано, Windows восстанавливает его исходный размер и положение. Приложение должно указывать этот флаг при первом отображении окна.


Более подробно о функции вы можете посмотреть в справке MSDN:

Необходимая нам функция находится в библиотеке shell32.dll.

Вызовем ее из MQL программы:


//---- импорт функции из внешней DLL
#import "shell32.dll"
int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import


Для начала напишем скрипт который будет открывать другой терминал:


//+------------------------------------------------------------------+
//|                                                  WindowsExit.mq4 |
//|                                             Copyright 2017, AM2. |
//|                                      http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2."
#property link      "http://www.forexsyatems.biz"
#property version   "1.00"
#property strict

//---- импорт функции из внешней DLL
#import "shell32.dll"
int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ShellExecuteW(NULL,NULL,"D:\\Program Files\\MetaTrader - EXNESS\\terminal.exe",NULL,NULL,1);
  }
//+------------------------------------------------------------------+



Можно скопировать адрес терминала с ярлыка на рабочем столе, только добавим в скопированную ссылку по одному слешу к уже имеющимся:

"D:\\Program Files\\MetaTrader - EXNESS\\terminal.exe"


Бросим скрипт на любой график и у нас откроется указанный в адресной строке терминал:



Для выключения компьютера найдем на диске программу shutdown.exe. И так же как и в предыдущем случае пропишем в функции адрес программы с необходимыми нам параметрами:

ShellExecuteW(NULL,NULL,"C:\\Windows\\System32\\shutdown.exe","-s -t 00",NULL,1);


Теперь подробнее о применении флагов в программе shutdown.exe:

Чтобы выключить компьютер, введите следующую строку:

shutdown.exe -s -t 00


Чтобы перезагрузить компьютер, введите следующую строку:

shutdown.exe -r -t 00


Чтобы посмотреть параметры для различных версий Windows пройдите по ссылке: www.computerhope.com/issues/ch000321.htm

П.С. Скрипт тестировался на ОС Windows 7 32 bit.
Скрипт можно скачать по ссылке: www.opentraders.ru/downloads/1696/
  • +21
  • Просмотров: 99471
  • 22 октября 2017, 13:05
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Пишем простейший цветной индикатор для МТ5
09 сентября 2017
10 апреля 2020

Брокер для ваших роботов, 15 лет на рынке

Комментарии (3)

+
+3
Без исходников вообще советники/индикаторы не буду теперь запускать *strah* 
avatar

  27  Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..

  • 22 октября 2017, 14:47
+
0
ShellExecute good unit.
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 24 октября 2017, 06:56
+
0
Интересно на что еще способны mql программы?! Как раз сегодня наткнулся на такой код

#property indicator_chart_window

#import  "shell32.dll"           //Connect a dll (provided with Windows)             
  int ShellExecuteA(int hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd); 
#import "user32.dll"
  int MessageBoxA(int hWnd ,string lpText,string lpCaption,int uType);
#import
// Тут тело программы
//
void CheckDonate()
{
   int fd=0; string pay="0"; datetime dt=0;
   string fn="VisualOrders.txt";
   fd=FileOpen(fn,FILE_READ|FILE_CSV,";");
   if(fd>=1)
   {
      pay=FileReadString(fd); if(pay!="0" && pay!="1") pay="0";
      dt=StrToTime(FileReadString(fd));
   }
   else
   {
      dt=TimeCurrent();
      fd=FileOpen(fn,FILE_WRITE|FILE_CSV,";");
      FileWrite(fd,"0",TimeToStr(dt,TIME_DATE));
   }
   FileClose(fd);
   
   if(pay=="0" && (TimeCurrent()-dt)>10*24*60*60) // 5 дней
   {
      if(MessageBoxA(0,"Если Вам понравился индикатор VisualOrders,\n хотите помочь автору материально?","Вопрос",4)==6)
      {
         ShellExecuteA(0,"Open","iexplore.exe","wmk<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/008.gif' alt=' :P '> ayto?Purse=R865705290089&Amount=100&Desc=Indicator&BringToFront=Y&ExecEvenKeeperIsOffline=Y","",7);
         pay="1";
      }
      dt=TimeCurrent();
      
      fd=FileOpen(fn,FILE_WRITE|FILE_CSV,";");
      FileWrite(fd,pay,TimeToStr(dt,TIME_DATE));
      FileClose(fd);
   }
   FileClose(fd);
}

В «инит» запускается эта функция. Любопытно что она делает! Сам не смог разобраться. Это из индикатора визуализации ордеров
avatar

  8  Kofa Сообщений: 42

  • 4 ноября 2017, 02:21

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий