Автоматизация с перехватом нажатия кнопок и мыши. - страница 10

 
DKeN:

Подскажите как отловить окно вызываемое по F9 (Ордер)

По тексту не ищется.

Пока его выловил следующим образом:

Мне кажется это совсем не надёжный способ. Попробуйте при открытом окне ордера открыть ещё какое-нибудь окно, например свойства графика, либо настройки терминала, либо глобальные переменные и т.д. Какое окно вам выдаст GetLastActivePopup?
 

Здравствуйте!

Подскажите, как определить дескриптор МТ из советника работающего в тестере?

Конструкция:

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
не работает, т.к.
WindowHandle(Symbol(),Period())

возвращает 0.

 

А график такой открыт в этот момент? (с указанным символом и периодом)

 
Meat:

А график такой открыт в этот момент? (с указанным символом и периодом)

Да, конечно.

Пробовал и так, и так.

Или это особенность ф-ции WindowHandle (хотя в справке об этом ни слова...)

Или я туплю...

 
lasso:

Да, конечно.

Пробовал и так, и так.

Или это особенность ф-ции WindowHandle (хотя в справке об этом ни слова...)

Или я туплю...

В режиме визуализации хэндл получается без проблем. А вы видимо тестите НЕ в визуальном режиме. Тогда всё логично: нет окна, нет и хэндла. А что касается остальных открытых окон, то как я понимаю, из тестера они недоступны.
В таком случае единственный выход - это искать окно Метатрэйдера в списке всех окон с помощью FindWindowExA(...)
 
Meat:

В режиме визуализации хэндл получается без проблем. А вы видимо тестите НЕ в визуальном режиме. Тогда всё логично: нет окна, нет и хэндла. А что касается остальных открытых окон, то как я понимаю, из тестера они недоступны.
В таком случае единственный выход - это искать требуемое окно в списке всех окон с помощью FindWindowExA(...)

Да, я попытался применить код Ilnur'a c пятой страницы:


Ilnur:

Вот пример скрипта, который запускает тестер стратегий и ожидает его завершение. Текст кнопки считывается с помощью функции GetWindowTextA().

Интересно, что при этом окно тестера необязательно должно быть видимым.

Но из тестера этот финт не прошел. (Я из тестера запускаю другой терминал на оптимизацию и хочу отследить завершение этого процесса.)

Если не затруднит, примерчик, для FindWindowExA(...) можете привести или ссыль?

 

Вот у меня такая функция для поиска окна:

#import "user32.dll"
  int FindWindowExA(int hwndParent,int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId(int hWnd,int lpdwProcessId);
  int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string textbuf="АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя";

int FindWindow(string class, string caption, bool captionexactly=false)
{    
  //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
  string null_string;
  int h=0;
  while(true)
  {    
    if (captionexactly)
      h=FindWindowExA(0,h,class,caption);
     else
      h=FindWindowExA(0,h,class,null_string);
    if (h==0) return(0);
    //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
    if (captionexactly) return(h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue;
    if (StringSubstr(textbuf,0,len)==caption) return(h);  
  }
  return(0);
}
 

Названия класса и заголовка требуемого окна ищи в SPY++.

Проверку ID потока я закомментировал, т.к. в данном случае оно не нужно (у нас нет исходного окна для сравнения).

Вообще советую разобраться с WinAPI-функциями, если собираешься их применять. Подробное описание функций ищи в MSDN (http://msdn.microsoft.com/en-us/library/ff818516.aspx)

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//получим количество в списке
//найдем пару
string fs="";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Print(ll," ",fs);
}

подскажите как правильно получить список инструментов в окне Ордер (F9)?

я получаю количество элементов, но получить именно строки по номеру не удается, возвращает -1.

#define ID_SYMBOL 0x053E //имя символа для выбора

cm хандл ComboBox


 
Meat:

Вот у меня такая функция для поиска окна:


Алексей, спасибо, ф-ция работает, но..
Meat:

Проверку ID потока я закомментировал, т.к. в данном случае оно не нужно (у нас нет исходного окна для сравнения).


Как раз ID потока нужен, т.к. у меня задействованы два терминала.

Я выкрутился через идентификацию заголовка, но хотелость бы всё таки знать, как ID потока определить из-под тестера?

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