Иногда бывает необходимо программно нажать кнопку в стороннем приложении, считать текст с определенного компонента. Все это можно сделать из программы на
MQL4 без знаний других языков программирования и опыта разработки в средах программирования. Приведу обзор лишь некоторых функций из библиотеки терминала
WinUser32.mqh.
Очень простой код позволит нам найти хендл любимого нами всеми "
Калькулятора". В справке мы можем прочитать что такое хендл.
Handle — это уникальный идентификатор, который представляет собой целое 32-х битное (4-х байтное) число. Handle позволяет обращаться к чему-либо в системе не по имени (или еще чему там можно придумать), а по соответствующему уникальному идентификатору. Например каждый элемент окна имеет свой handle. Все значения идентификаторов разные, т.е. уникальные. Если есть два одинаковых окна, то элементы этих окон все равно будут иметь разные идентификаторы. Понятие handle используется не только для идентификации элементов окна, но и например для файлов, процессов, потоков (threads) и т.д. На самом деле ОС работает с файлами, процессами, потоками (threads) не по их имени, а по их идентификатору.
Вначале создадим шаблон советника и включим в него библиотеку терминала
WinUser32.mqh.
#include <WinUser32.mqh>
Поиск хендла окна "
Калькулятора" осуществим с помощью функции
WinApi —
FindWindowW.
Описание этой функции в
справке 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
Комментарии (4)
11 pilot Сообщений: 410
а пока только
Alert(Ask," ",Bid);
13 Enot-pipsun Сообщений: 301
привязав его к кнопке индикатора выводимой в окно, на график?
11 preasto Сообщений: 445
8 Voland-Z Сообщений: 259 - Ищук Александр
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий