AM2
Андрей

 
Уровень 34

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


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

Рейтинг 280



Как управлять сторонним приложением из программы на MQL4

Иногда бывает необходимо программно нажать кнопку в стороннем приложении, считать текст с определенного компонента. Все это можно сделать из программы на MQL4 без знаний других языков программирования и опыта разработки в средах программирования. Приведу обзор лишь некоторых функций из библиотеки терминала WinUser32.mqh.

Очень простой код позволит нам найти хендл любимого нами всеми "Калькулятора". В справке мы можем прочитать что такое хендл.

Handle — это уникальный идентификатор, который представляет собой целое 32-х битное (4-х байтное) число. Handle позволяет обращаться к чему-либо в системе не по имени (или еще чему там можно придумать), а по соответствующему уникальному идентификатору. Например каждый элемент окна имеет свой handle. Все значения идентификаторов разные, т.е. уникальные. Если есть два одинаковых окна, то элементы этих окон все равно будут иметь разные идентификаторы. Понятие handle используется не только для идентификации элементов окна, но и например для файлов, процессов, потоков (threads) и т.д. На самом деле ОС работает с файлами, процессами, потоками (threads) не по их имени, а по их идентификатору.


Вначале создадим шаблон советника и включим в него библиотеку терминала WinUser32.mqh.

#include <WinUser32.mqh>


Поиск хендла окна "Калькулятора" осуществим с помощью функции WinApiFindWindowW.
Описание этой функции в справке MSDN следующее:



В библиотеке терминала функция описана следующим образом:

int FindWindowW(string lpClassName,string lpWindowName);


Это означает, что в параметр string lpClassName необходимо ввести имя класса нашего приложения, а вместо параметра string lpWindowName имя окна программы — «Калькулятор». Имя класса приложения можно узнать с помощью таких утилит как: Spy++, WinSight, WinInspector и др.

Запустим одну из них — Spy++ ее можно скачать по ссылке: www.opentraders.ru/downloads/853/

Spy++ (SPYXX.EXE) — это служебная программа на основе Win32, предоставляющее графическое представление системных процессов, потоков, окон и сообщений окон.


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



В функции FindWindowW можно указывать и имя класса и имя окна или по отдельности.

Нам достаточно будет указать только имя окна:

int h=FindWindowW(NULL,"Калькулятор");



//+------------------------------------------------------------------+
//|                                                       WinApi.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int h=FindWindowW(NULL,"Калькулятор");
   Comment("\n Handle: ",h);
  }
//+------------------------------------------------------------------+


Теперь посмотрим наш код в действии:



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

Добавим в наш код еще одну простую функцию SetWindowTextW. Она изменит текст окна "Калькулятора" на любой другой.

SetWindowTextW(h,"Бульбулятор");


И вуаля наш "Калькулятор" превратился в "Бульбулятор" :) 



Наш окончатальный код примет следуюший вид:


//+------------------------------------------------------------------+
//|                                                       WinApi.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   string s;
   int h=FindWindowW(NULL,"Калькулятор");
   SetWindowTextW(h,"Бульбулятор");

   Comment("\n Handle: ",h);
  }
//+------------------------------------------------------------------+



П.С. В библиотеке WinUser32.mqh вы сможете также найти и много других интересных функций, которые позволят вам управлять сторонней программой прямо из советника на MQL4. Полный список функций WinApi вы можете найти на сайте MSDN
  • +6
  • Просмотров: 15718
  • 2 октября 2015, 12:28
  • AM2
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Программирование на MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Кручу-верчу - убыток получу.
16 сентября 2015
12 октября 2015

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

+
+1
Полезно. Спасибо.
avatar

  11  pilot Сообщений: 410

  • 2 октября 2015, 13:42
+
0
надеюсь я вырасту когда-нибудь до такого уровня программирования.
а пока только
Alert(Ask," ",Bid);

:D 
avatar

  12  Enot-pipsun Сообщений: 292

  • 2 октября 2015, 19:24
+
0
Возможно ли таким способом запускать любой нужный скрипт из папки ...\MQL4\Scripts МТ4
привязав его к кнопке индикатора выводимой в окно, на график?
avatar

  11  preasto Сообщений: 445

  • 28 января 2017, 13:53
+
0
Устал искать в инете, как запустить ссылку из скрипта без создания своего приложения. из mql4 используя эту библиотеку? WinUser32.mqh
Редактирован: 22 апреля 2017, 13:17
avatar

  8  Voland-Z Сообщений: 259 - Ищук Александр

  • 22 апреля 2017, 13:01

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