Изменение настроек советника - страница 2

 

Всем привет!

С API не поможете или это на другие форумы?)

Во-первых, не пойму к какому хэндлу "прикручивать" F7(что бы сразу вызвать окно настроек советника), и правильно ли я задал константу? 

Во-вторых, Если делать через контекстное меню, по ПКМ - вызывает диалог, который появляется если нажать ПКМ на пустом поле индикатора, а не графика (там отличие только в верхней строчке, но всё же... интересно),

Spy++ определяет один одинаковый хэндл у графика и индикатора.

В-третьих, самое главное (до этого всё просто неудобно, интересно, а вот без этого даже коряво не получается) - когда я через API делаю ПКМ пусть по полю индикатора, но там есть (в первой же строке) "Советники", но код дальше этого места не выполняется!

Почему?!) или Как продолжить работу с этим списком/окном.

 А потом ещё Spy++ окно свойств (вызванное вручную) "прицелом" из поиска определяет, свойства показывает, а в списке не находит. 

Вот код, там в начале "украл" функцию типа EnumWindows для поиска окна по заголовку и его хэндла + текстбоксы для отладки - не заморачивайтесь)...Кстати, если кому не трудно - может покажите пример с EnumWindow для поиска окна, а то громоздко выходит. А в идеале - готовый код по открытию свойств советника))).

P.S. Работаю в VS2010, с хэндлами дело имел только на VB6 и давно.  И ещё - не подскажите почему сами числа хэндлов в Spy++ и "Приложении" отличаются?

P.P.S. FAQ, вот "через винапи вызывать окно настроек советника" и не получается).

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim WN, WN2 As String
Dim HA As IntPtr = 0
Dim HB As Integer = 0
Dim HC As Integer = 0
Dim HD As Integer = 0
Dim HE As Integer = 0

Const WM_RBUTTONDOWN As Integer = &H204
Const WM_RBUTTONUP As Integer = &H205

' Const WM_F7 As Integer = &H76

For Each j As WindowInfo In GetWindows()
If j.IsVisible And (j.Caption.Length > 0) Then
WN = j.Caption
WN2 = Mid(WN, 10, 34)
If WN2 = "MMCIS MetaTrader 4 Client Terminal" Then
TextBox1.Text = WN
TextBox2.Text = WN2
HA = FindWindow(vbNullString, WN)
TextBox3.Text = HA

HB = FindWindowEx(HD, 0, "MDIClient", "")  'класс взят из Spy++
TextBox4.Text = HB

HC = FindWindowEx(HB, 0, vbNullString, "EURUSD,M15")
TextBox5.Text = HC

SendMessage(HC, WM_RBUTTONDOWN, 0, 0) ' тут выполнение кода останавливается
SendMessage(HC, WM_RBUTTONUP, 0, 0)

HD = FindWindowEx(HD, 0, "#32768 (Всплывающее меню)", "") 'класс взят из Spy++
TextBox7.Text = HD

Exit For
End If
End If
Next

End Sub 

 
paramore1999:

Всем привет!

С API не поможете или это на другие форумы?)

Во-первых, не пойму к какому хэндлу "прикручивать" F7(что бы сразу вызвать окно настроек советника), и правильно ли я задал константу? 

Во-вторых, Если делать через контекстное меню, по ПКМ - вызывает диалог, который появляется если нажать ПКМ на пустом поле индикатора, а не графика (там отличие только в верхней строчке, но всё же... интересно),

Spy++ определяет один одинаковый хэндл у графика и индикатора.

В-третьих, самое главное (до этого всё просто неудобно, интересно, а вот без этого даже коряво не получается) - когда я через API делаю ПКМ пусть по полю индикатора, но там есть (в первой же строке) "Советники", но код дальше этого места не выполняется!

Почему?!) или Как продолжить работу с этим списком/окном.

 А потом ещё Spy++ окно свойств (вызванное вручную) "прицелом" из поиска определяет, свойства показывает, а в списке не находит. 

Вот код, там в начале "украл" функцию типа EnumWindows для поиска окна по заголовку и его хэндла + текстбоксы для отладки - не заморачивайтесь)...Кстати, если кому не трудно - может покажите пример с EnumWindow для поиска окна, а то громоздко выходит. А в идеале - готовый код по открытию свойств советника))).

P.S. Работаю в VS2010, с хэндлами дело имел только на VB6 и давно.  И ещё - не подскажите почему сами числа хэндлов в Spy++ и "Приложении" отличаются?

P.P.S. FAQ, вот "через винапи вызывать окно настроек советника" и не получается).

Здесь есть функция ServicePropertiesExpert(). Не помню, как делал. Посмотреть надо. Но там всего одна строчка для открытия свойств эксперта.
 

Спасибо, посмотрел.

Окно свойств открывается.

Может кому пригодится: 

#include <WinUser32.mqh> // Заголовочный файл библиотеки "user32.dll" функций API Windows XP.
#include <stdlib.mqh> // Заголовочный файл библиотеки дополнительных функций.
#include <ServicesMT4.mqh> // Заголовочный файл библиотеки "ServicesMT4.dll".

 int start()
{
//----
int hwndChart = WindowHandle(Symbol(), 0);
ServicePropertiesExpert(hwndChart);
//----
return(0);
}

Только такой вопрос - а как   int hwndChart = WindowHandle(Symbol(), 0); получает хэндл, если окна ещё нет (Spy++  его не видит и FindWindow(...) = 0)?

Теперь индикатор мониторит условие, при изменении вызывает это окно и пишет в файл что угодно (пока что), прога ловит изменение в текстовике и начинает работать по API с окном свойств (предварительно найдя его).

Буду пробовать...Эх, вот бы была dll с продолжением - изменением указанных свойств советника, ну или хотя бы загрузкой готовых на выбор. Тогда бы всё можно было сделать силами индикатора...

Где можно почитать для чайников как создавать такие вещи (другими словами - создавать либы с функциями)?

Или последовательность создания, например, у меня до этого получился код вызова какого-то контекстного меню по ПКМ - как это в виде dll и mqh выпустить в виде готового к подключению к МТ4 набора?

Что бы потом забыть про внешнюю прогу. 

 

Всем привет!

Написал я "форменное" приложение по нажатию кнопки меняет настройку советника.

А как теперь это убрать в dll и mqh?

Код выкладывать? (на VB.NET 2010 c WinAPI и Threading) Ну и чайниковский вопрос - а как код в посте под спойлер убрать?)

P.S. Spy++ рулит!)

 
paramore1999 :

Ну и чайниковский вопрос - а как код в посте под спойлер убрать?)

Никак, а было бы неплохо. Можно код прицепить аттачем.
 

Вот код, не идеально)...урывками делалася...не претендует на хит сезона, может кому поможет).

А цитировать как?)

 
А почему файл не прилип? Обзор -> выбрал, а что ещё?
 
paramore1999 :

А цитировать как?)

Вот так
 

Вот создал я dll c Sub B(), который, например, просто открывает окно настроек совы, откомпилил, файл ClassLibrary1.dll положил в C:\Program Files (x86)\MMCIS MetaTrader 4 Client Terminal\experts\libraries

В C:\Program Files (x86)\MMCIS MetaTrader 4 Client Terminal\experts\include положил M4.mqh с текстом

#import "ClassLibrary1.dll"
void B();
#import

В скрипте пишу

#property show_confirm
#include <WinUser32.mqh>
#include <stdlib.mqh>
#include <M4.mqh>

int start()
{
B();
return(0);
}

Скрипт даже не компилится:

'B' - function is not defined

Я понимаю, что наивно полагать, что всё так просто, но в качестве отправной точки - что здесь не так?

 

Или надо создавать не Sub, а Funсtion? Заодно в аргументах будет на что менять настройку...

И при чем тут вообще mqh? Можно сразу импортировать dll в скрипте?

Причина обращения: