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

 

Захотел побаловаться с окнами терминала, сделать программку которая сама открывает ордер через клики по кнопкам. Нашел 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);
        }
    }
}
 

Вроде это -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). Если приложение предназначено для международного использования с различными клавиатурами, применение метода может иметь непредсказуемые результаты и его следует избегать. Чтобы указать...
 
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 источник К...
 
Maxim Dmitrievsky:

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

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

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

 
Yuriy Asaulenko:

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

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

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

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

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

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

ЗЫ Если интересует именно  вопрос взаимодействия МТ с С#, то можно в личке обсудить. Вроде решил, и у людей работает. Псевдо API))
меня интересует вопрос именно программного нажатия кнопок, сейчас просто не получается получить идентификатор кнопки контрола, там как-то по хитрому нужно, у меня пока знаний не хватает )
 
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
Данная статья переведена с помощью средств машинного перевода. Чтобы просмотреть ее на английском языке, установите флажок Английский. Вы также можете просматривать английский текст во всплывающем окне, наводя указатель мыши на переведенный текст.
 
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 не знаю как это реализовать
 
Maxim Dmitrievsky:
потому что я хочу потом сделать dll для эксперта, что бы все было унифицировано, через UIAutomation не знаю как это реализовать
Если ДЛЛ на C# со связью с МТ, то только через перекодирование ДЛЛ в сторонней утилите. Поищу днем.
 
Yuriy Asaulenko:
Если ДЛЛ на C# то только через перекодирование ДЛЛ в сторонней утилите. Поищу днем.

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

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

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