Помогите нажать на кнопку в терминале из C# winApi - страница 2

 
Maxim Dmitrievsky:

ну к чему такие сложности.. ) в С# просто удобно заниматься отладкой. сделать все через winapi, a затем просто переписать ф-ии на mql, и усе

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

Вообще это несложно - несколько ударов по клавишам.) Зато можно писать обычные (как-бы нешарповые) ДЛЛ на С#.

В тулбаре нет, но у F1-9 и пр. вроде все в порядке. Вроде их хотели?

 
Yuriy Asaulenko:

Вообще это не сложно - несколько ударов по клавишам.) Зато можно писать обычные (как-бы нешарповые) ДЛЛ на С#.

В тулбаре нет, но у F1-9 и пр. вроде все в порядке. Вроде их хотели?

да, попробую сейчас открыть окошко отправки ордеров через меню программы, не через кнопку :)
 
Maxim Dmitrievsky:

Захотел побаловаться с окнами терминала, сделать программку которая сама открывает ордер через клики по кнопкам. Нашел hwnd тулбара с кнопками, где есть кнопка newOrder (F9) в mt5, не могу сейчас понять как ее найти и сделать клик по ней. Туго идет, вообще никогда раньше не делал подобное. а дальше разберусь, думаю, по принципу и подобию..

Что касается кнопки, ее нажимать и не нужно. Шлите сразу сообщение о нажатии F9 на клавиатуре. Конечно, при этом окно самого терминала или некоторых из его дочерних окон должно быть активно и в фокусе.

Чтобы разобраться дальше, потребуются гораздо большие усилия. Как ни крути, придется написать анализатор иерархии окон, вообще-то несложный. Функция (1) вызывается для одного окна, выдает в протокол его имя, имя класса, координаты и размеры. Затем проходит по всем дочерним окнам уже описанного окна и на каждом из них вызывает себя, функцию (1). Пока не окажется, что все дочерние уже обработаны.

Очень тяжело будет ввести числа в поля: объем открываемой сделки, стоп лосс, тейк профит. Задать инструмент, по которому сделка открывается: необходимо раскрыть выпадающее меню инструментов и в нем выбрать кликом мыши по нужным координатам, сделав эту часть меню видимой, если опций много. При этом обязательно, чтобы имена инструментов читались из каких-то полей в структурах. Пока Метаквотес используют Майкрософт фаундейшен классес (MFC) в чистом виде, это годится. Как только на событие перерисовки опции меню повесят свою функцию, столь простая идентификация опций меню станет невозможной, придется заниматься еще и распознаванием текста. Это не очень страшно, шрифты весьма простые. Тем более в случае, когда придется писать закрытие ордера путем его выбора в списке закладки "Торговля", это и так придется делать.

Это пока с точки зрения перспектив написания. Однако никакой гарантии работоспособности такого подхода дать нельзя. Первое, сразу будет заметно, активность окон может меняться по чужой инициативе, невидимой созданной программе. Сообщения ОС, антивирусов и многих других могут в нужный момент отнять активность у окна, куда посылается сообщение. И все, нить утеряна. Причем бывают окна модальные, из которых нельзя просто так уйти, не нажав что-нибудь.

Второе, более стратегическое. Разработчики MT могут изменить все, что угодно. Хоть имя какого-нибудь окна, в том числе для устранения орфографической ошибки. И все, построенная на именах окон и классов навигация не работает.

Это не прогнозы, на оба варианта я наткнулся лично, написав в свое время имитатор ручной торговли для ежедневного конкурса "Гагарин", где советники были запрещены.

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

 
Vladimir:

Что касается кнопки, ее нажимать и не нужно. Шлите сразу сообщение о нажатии F9 на клавиатуре. Конечно, при этом окно самого терминала или некоторых из его дочерних окон должно быть активно и в фокусе.

Чтобы разобраться дальше, потребуются гораздо большие усилия. Как ни крути, придется написать анализатор иерархии окон, вообще-то несложный. Функция (1) вызывается для одного окна, выдает в протокол его имя, имя класса, координаты и размеры. Затем проходит по всем дочерним окнам уже описанного окна и на каждом из них вызывает себя, функцию (1). Пока не окажется, что все дочерние уже обработаны.

Очень тяжело будет ввести числа в поля: объем открываемой сделки, стоп лосс, тейк профит. Задать инструмент, по которому сделка открывается: необходимо раскрыть выпадающее меню инструментов и в нем выбрать кликом мыши по нужным координатам, сделав эту часть меню видимой, если опций много. При этом обязательно, чтобы имена инструментов читались из каких-то полей в структурах. Пока Метаквотес используют Майкрософт фаундейшен классес (MFC) в чистом виде, это годится. Как только на событие перерисовки опции меню повесят свою функцию, столь простая идентификация опций меню станет невозможной, придется заниматься еще и распознаванием текста. Это не очень страшно, шрифты весьма простые. Тем более в случае, когда придется писать закрытие ордера после его выбора в списке закладки "Торговля", это и так придется делать.

Это пока с точки зрения перспектив написания. Однако никакой гарантии работоспособности такого подхода дать нельзя. Первое, сразу будет заметно, активность окон может меняться по чужой инициативе, невидимой созданной программе. Сообщения ОС, антивирусов и многих других могут в нужный момент отнять активность у окна, куда посылается сообщение. И все, нить утеряна. Причем бывают окна модальные, из которых нельзя просто так уйти, не нажав что-нибудь.

Второе, более стратегическое. Разработчики MT могут изменить все, что угодно. Хоть имя какого-нибудь окна, в том числе для устранения орфографической ошибки. И все, построенная на именах окон и классов навигация не работает.

Это не прогнозы, на оба варианта я наткнулся лично, написав в свое время имитатор ручной торговли для ежедневного конкурса "Гагарин", где советники были запрещены.

а как эмулировать нажатие F9 через winapi, можно ссылочку если не сложно? ) Что касается стопа и тэйка они мне не нужны, будет работать по рынку, еще если вы замечали, при нажатии f9 нужный символ подбирается автоматически, в зависимости от того график какого символа сейчас активен, т.е. можно просто переносить фокус на нужный открытый чарт, я полагаю... И размер лота можно задать в настройках мт и он так же сохраняется при последующем вызове окна

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

 
Maxim Dmitrievsky:

а как эмулировать нажатие F9 через winapi, можно ссылочку если не сложно? ) Что касается стопа и тэйка они мне не нужны, будет работать по рынку, еще если вы замечали, при нажатии f9 нужный символ подбирается автоматически, в зависимости от того график какого символа сейчас активен, т.е. можно просто переносить фокус на нужный открытый чарт, я полагаю...

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

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms646304(v=vs.85).aspx

Примеры использования в Delphi

      keybd_event (vk_F9, 0, 0, 0);
      hOrd := WaitChildWnd (NowHWnd, Tms); {Ждем активации Tms миллисекнуд}
      if hOrd = 0 then begin ODCiEr := -8; goto Clo; end;

{Нажатие Ctrl-F9, это горячая клавиша MT4 - переход в окно "Терминал" с возможностью работать клавиатурой}
procedure PressCtrlF9;
begin
keybd_event (VK_LCONTROL, 0, 0, 0);  {Жмем и держим Ctrl}
keybd_event (vk_F9, 0, 0, 0);
keybd_event (VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0); {Отпускаем Ctrl}
end; {PressCtrlF9}

{Ждет не больше Tms миллисекунд, пока у окна hw появится активное дочернее, порожденное терминалом NowHWDC. Появилось - вернет его хендл, иначе 0}
function WaitChildWnd (hw : THandle; Tms : longint) : THandle;
var
  Newhw : THandle;
  D : double;
begin
D := Now + Tms * DivMS; {Когда конец ожидания}
While Now < D do
  begin
  Newhw := GetForegroundWindow;
  if (Newhw <> hw) and (WndOfNowPrc (hw) = 0) then
    begin WaitChildWnd := Newhw; exit; end;
  Sleep (StepMsHand);
  end;
WaitChildWnd := 0;
end; {WaitChildWnd}

{У окна hw проверит, что оно запущено процессом терминала ДЦ номер NowHWDC}
function WndOfNowPrc (hw : THandle) : longint; {0 - да, 1 - нет, -1 - окна нет}
var
  hThr, hPrc : LongWord; {Идентификаторы потока и процесса, создавших окно}
begin
hThr := GetWindowThreadProcessId (hw, @hPrc);
if hThr <> 0 then WndOfNowPrc := byte (hPrc <> AllWDC [NowHWDC].WDCPrc)
             else WndOfNowPrc := -1;
end; {WndOfNowPrc}
 
Спасибо, думаю разберусь теперь )
 
Maxim Dmitrievsky:
Спасибо, думаю разберусь теперь )

https://www.mql5.com/ru/forum/110207  

PostMessageA  35458

не благодарите )) 

research по теме кодов к PostMessageA
research по теме кодов к PostMessageA
  • www.mql5.com
Уважаемые все, кому это собственно интересно. Провел тут небольшое исследование на тему кодов к функции PostMessageA, результат выкладываю ниже...
 
o_O:

https://www.mql5.com/ru/forum/110207  

PostMessageA  35458

не благодарите )) 

С этим я уже разобрался:) А не подскажете, почему int iHandle = FindWindowExW(IntPtr.Zero, IntPtr.Zero, null, "Order"); всегда возвращает ноли в mql, а если на шарпе делаю то все ок.. Может тз-за того что ф-ии переопределены неправильно, и тут нужен тип не int a hwnd. А, все, понял сам.. 
 
Maxim Dmitrievsky #:
С этим я уже разобрался:) А не подскажете, почему int iHandle = FindWindowExW(IntPtr.Zero, IntPtr.Zero, null, "Order"); всегда возвращает ноли в mql, а если на шарпе делаю то все ок.. Может тз-за того что ф-ии переопределены неправильно, и тут нужен тип не int a hwnd. А, все, понял сам.. 

а как вы до Edit элементов (символ прежде всего) внутри окна ордера добрались?

 
leonerd #:

а как вы до Edit элементов (символ прежде всего) внутри окна ордера добрались?

аа, нашёл уже сам.