Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Maxim Dmitrievsky
18097
Maxim Dmitrievsky  

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        const int WM_SYSCOMMAND = 0x0112;
        const int SC_CLOSE = 0xF060;
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        [DllImport("user32.dll")]
        public static extern int FindWindow(
           string lpClassName, // class name
           string lpWindowName // window name
                             );

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(
            IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName
            );

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

        //Используем


        static void Main(string[] args)
        {

            IntPtr iHandle = FindWindowEx(IntPtr.Zero, IntPtr.Zero, null, "8501757 - RoboForexEU-MetaTrader 5: Demo Account - [AUDCHF,H1]");
            IntPtr standart = FindWindowEx(iHandle, IntPtr.Zero, null, "Timeframes");
            IntPtr button1 = FindWindowEx(standart, IntPtr.Zero, null, "Standard");

            //Тут, как я понимаю, нужно найти сейчас список кнопок контрола ToolbarWindow32, но не умею как
            //SendMessage(button1, WM_LBUTTONDOWN, 00008050, 00000000);
            //SendMessage(button1, WM_LBUTTONUP, 00008050, 00000000);
        }
    }
}
Yuriy Asaulenko
4115
Yuriy Asaulenko  

Вроде это -https://msdn.microsoft.com/ru-ru/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

Но не непосредственно через винапи. 

Метод SendKeys.Send (String) (System.Windows.Forms)
Метод SendKeys.Send (String) (System.Windows.Forms)
  • msdn.microsoft.com
В других приложениях квадратные скобки имеют специальное значение, что может привести к значительной при возникновении динамический обмен данными (DDE). Если приложение предназначено для международного использования с различными клавиатурами, применение метода может иметь непредсказуемые результаты и его следует избегать. Чтобы указать...
Maxim Dmitrievsky
18097
Maxim Dmitrievsky  
Yuriy Asaulenko:

Вроде это -https://msdn.microsoft.com/ru-ru/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

Но не непосредственно через винапи. 

это если кликать по своему приложению, не стороннему, как я понимаю.. для стороннего нужно через winapi. Вот нашел более-менее внятный пример, попробую сделать..

http://ru.stackoverflow.com/questions/446899/%D0%9D%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D0%B5-%D0%BD%D0%B0-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D1%83-%D0%B2-toolbar-sendmessage-%D0%B2-%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%BD%D0%B5%D0%BC-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8 

Нажатие на кнопку в ToolBar (SendMessage) в стороннем приложении
Нажатие на кнопку в ToolBar (SendMessage) в стороннем приложении
  • ru.stackoverflow.com
Имеется диалоговое окно, handle которого я поймал, так же обнаружил handle принадлежащий ToolbarWindow32, никак не получается нажать на одну из 4 кнопок в тулбаре. Увы, кнопки нажиматься отказываются. Нашел немного материала по VBA, но не могу перенести код на C#. Удалось перенести только часть. Информацию нашел здесь: 1 источник, 2 источник К...
Yuriy Asaulenko
4115
Yuriy Asaulenko  
Maxim Dmitrievsky:

это если кликать по своему приложению, не стороннему, как я понимаю.. для стороннего нужно через winapi. Вот нашел более-менее внятный пример, попробую сделать..

Это тоже будет работать. Вопрос только в том, как сделать приложение МТ активным, кликая в активной форме или консоли. Если кликающее приложение сделать фоновым, то все будет, но так не это нужно.(

Расскажите что получится. 

Maxim Dmitrievsky
18097
Maxim Dmitrievsky  
Yuriy Asaulenko:

Это тоже будет работать. Вопрос только в том, как сделать приложение МТ активным, кликая в активной форме или консоли. Если кликающее приложение сделать фоновым, то все будет, но так не это нужно.(

Расскажите что получится. 

через SetFocus наверное, в winapi, пока не уверен
Yuriy Asaulenko
4115
Yuriy Asaulenko  
Maxim Dmitrievsky:
через SetFocus наверное, в winapi, пока не уверен

А черт его знает. Не нравится мне этот  SetFocus. И не умею его готовить.) С этой имитацией клавы всегда куча проблем. ИМхо, лучше не связываться, если для конкретной работы, а не просто посмотреть.

ЗЫ Если интересует именно  вопрос взаимодействия МТ с С#, то можно в личке обсудить. Вроде решил, и у людей работает. Псевдо API))
Maxim Dmitrievsky
18097
Maxim Dmitrievsky  
Yuriy Asaulenko:

А черт его знает. Не нравится мне этот  SetFocus. И не умею его готовить.) С этой имитацией клавы всегда куча проблем. ИМхо, лучше не связываться, если для конкретной работы, а не просто посмотреть.

ЗЫ Если интересует именно  вопрос взаимодействия МТ с С#, то можно в личке обсудить. Вроде решил, и у людей работает. Псевдо API))
меня интересует вопрос именно программного нажатия кнопок, сейчас просто не получается получить идентификатор кнопки контрола, там как-то по хитрому нужно, у меня пока знаний не хватает )
Yuriy Asaulenko
4115
Yuriy Asaulenko  
Maxim Dmitrievsky:
меня интересует вопрос именно программного нажатия кнопок, сейчас просто не получается получить идентификатор кнопки контрола, там как-то по хитрому нужно, у меня пока знаний не хватает )
А зачем именно через ВинАПИ? В С# и SetFocus есть. - https://msdn.microsoft.com/ru-ru/library/system.windows.automation.automationelement.setfocus(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1 Использовал когда-то, но только внутри приложения не выходя наружу. С кодом клавиш из С# точно проще - там таблица в SendKey.
Метод AutomationElement.SetFocus (System.Windows.Automation)
Метод AutomationElement.SetFocus (System.Windows.Automation)
  • msdn.microsoft.com
Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
Maxim Dmitrievsky
18097
Maxim Dmitrievsky  
Yuriy Asaulenko:
А зачем именно через ВинАПИ? В С# и SetFocus есть. - https://msdn.microsoft.com/ru-ru/library/system.windows.automation.automationelement.setfocus(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1 Использовал когда-то, но только внутри приложения не выходя наружу.
потому что я хочу потом сделать dll для эксперта, что бы все было унифицировано, через UIAutomation не знаю как это реализовать
Yuriy Asaulenko
4115
Yuriy Asaulenko  
Maxim Dmitrievsky:
потому что я хочу потом сделать dll для эксперта, что бы все было унифицировано, через UIAutomation не знаю как это реализовать
Если ДЛЛ на C# со связью с МТ, то только через перекодирование ДЛЛ в сторонней утилите. Поищу днем.
Maxim Dmitrievsky
18097
Maxim Dmitrievsky  
Yuriy Asaulenko:
Если ДЛЛ на C# то только через перекодирование ДЛЛ в сторонней утилите. Поищу днем.

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

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

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