Скачать MetaTrader 5

Windows SDK команды для MetaEditor

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

Здравствуйте, MQL5 Community!

Я застрял на очень простой операции: копирование кода из MetaEditor. Уже 2 дня пытаюсь победить, только, по-видемому, это сильнее меня. Хотя мой вопрос и не относится к MQL5, ответ на него будет ценнен всем пользователям продуктов MetaQuotes для Windows. Я использую функциональность Windows SDK для открытия файла в MetaEditor. Запускаю процесс metaeditor64.exe в C#, посылаю команду "-open" с именем файла, посылаю комбинацию клавиш Ctrl+A для выделения текста. Все работает как часы. Дальше труба. MetaEditor не воспринимает комбинацию Ctrl+C. Если пальцами с клавы, то работает. С помощью кода нет. Что я уже испробовал:

1. Импортирую user32.dll. С помощью функции GetForgroundWindow() нахожу активное окно MetaEditor. Находит без проблем. Так же без проблем могу найти заголовок окна с помощью GetWindowText(). Затем с помощю keybd_event симулирую Ctrl down, C down, C up, Ctrl up - эквивалент Ctrl+C. Файл открыт, текст выделен, буфер обмена ПУСТ. Также пробовал InputSimulator, что то же самое и что также неифективно.

2. Пробовал посылать Windows Messages вот так:

string copied;
            StringBuilder sb = new StringBuilder(10000);
            const int WM_GETTEXT = 13;

            // Find foreground window
            IntPtr hWnd = GetForegroundWindow();

            uint processId;

            // Bring focus to active control
            uint activeThreadId = GetWindowThreadProcessId(hWnd, out processId);

            uint currentThreadId = GetCurrentThreadId();

            AttachThreadInput(activeThreadId, currentThreadId, true);

            IntPtr focusedHandle = GetFocus();

            AttachThreadInput(activeThreadId, currentThreadId, false);

            //Get the text from the active window into the stringbuilder
            SendMessage(focusedHandle, WM_GETTEXT, sb.Capacity, sb);
            copied = sb.ToString();

            return copied;

Этот код фокусирует handle на активный элемент программы. Так как текст выделен в файле, этим элементом должен быть Edit Control или Rich Edit Control. Код прекрасно работает с блокнотом, возвращая написанное. С MetaEditor тот же код возвращает string.Empty. Напомню, все функции в коде, родные члены Windows API.

Вопросы к разработчикам: возможна ли работа внутренностей MetaEditor с Windows API? Понимает ли MetaEditor стандартные сообщения от Windows, такие как WM_GETTEXT? Как MetaEditor работает с буфером обмена? Возможна ли кодовая операция копирования выделенного из MetaEditor?

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

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
Файловые операции / FileOpen - Документация по MQL5
MetaQuotes
Админ
25203
Renat Fatkhullin  
GetText из редактора не сработает, так как у нас собственный контрол поля редактирования. Попробуйте забирать скопированный текст из буфера обмена.
o_o
Модератор
24033
o_o  
Clipboard
Clipboard
  • голосов: 11
  • 2010.04.27
  • MSDN
  • www.mql5.com
Получение содержимого буфера обмена (clipboard)
Burton
73
Burton  
Спасибо, все работает с буфером обмена!

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