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

 

Осталось совсем чуть чуть, решить как говорится пару дел.

Мужики помогайте, заковыристый этот WinAPI не для профи. первый раз с ним работаю.


Застопорился на 2-х вещах.


1. Как вернуть номер строки по названию эксперта из ComboBox где список советников.


Делаю вот так


#define CB_FINDSTRING 0x014C
#define CB_SETCURSEL  0x014E

hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
hTerminal = GetDlgItem(hMetaTrader,0xE81E);                                // Дескриптор окна валютной пары
hTester = GetDlgItem(hTerminal,0x53);                                      // Дескриптор окна тестера стратегий
ExpertsComboBox = GetDlgItem(GetDlgItem(hTester,0x81BF),0x468);            // Дескриптов списка экспертов

int exep = SendMessageA(ExpertsComboBox, 0x014C, 0, "Test_Expert");
Print("Строка № ", exep);

Возвращает нуль и все тут. Хотя тоже самое делаю в программе InqSoft Windows Scaner возвращает номер строки.


Далее использую функцию


SendMessageA(ExpertsComboBox, 0x014E, 12, 0);                              // Установка эксперта

Все работает как нужно, но вот как получить эту цифру 12, пока незнаю.


2. Это проблема со вставкой даты. YuraZ, Вы вроде объяснили, но я нифига не понимаю как подступится к тому, что Вы объяснили. С пощелкиванием тоже пока не представляю как это сделать.


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


После окончания и проверки хочу все оформить в виде статьи, думаю для многих данная функция будет полезной, хотя не факт что разработчики пропустят данную инфу.

 
HIDDEN >>:

как вариант


не стоит считать сколько там строчек либо еще как то мучаться

достаточно поискать нашего экперта "нашего героя экперта" в списке

по логике если сделать счетчик то можно и номер из списка поднять

только надо найти верх списка и пробежать вниз или найти низ и пробежать вверх

//+------------------------------------------------------------------+
//|                                                                  |
//|                                           YURAZ Copyright © 2008 |
//|                         www.mail.ru yzh@mail.ru yyuraz@gmail.com |
//+------------------------------------------------------------------+
#property copyright "YURAZ Copyright © 2008"
#property link      "www.mail.ru yzh@mail.ru yyuraz@gmail.com"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   
#define CB_FINDSTRING 0x014C
#define CB_SETCURSEL  0x014E

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
int hTerminal = GetDlgItem(hMetaTrader,0xE81E);                                // Дескриптор окна валютной пары
int hTester = GetDlgItem(hTerminal,0x53);                                      // Дескриптор окна тестера стратегий
int ExpertsComboBox = GetDlgItem(GetDlgItem(hTester,0x81BF),0x468);            // Дескриптов списка экспертов



/// ищем нашего героя условие мы должны стоять на первом в списке
{ 

  string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";

  GetWindowTextA( ExpertsComboBox , p1 , 250 );
 

   
  
   Print("Имя текущего эксперта ", p1    );
 // можно в цикле пощелкать и найти 
  if ( p1 != "имя нашего героя")
      PostMessageA (ExpertsComboBox, WM_KEYDOWN,VK_DOWN, 0); // Сместились на нужную строчку.
  esle
     // break from  
 }
 
//   если последний толчок клавиши выдает то же самое имя - тормозим цикл
//  это все на уровни идеи описал..  обрисуйте как Вам надо сами
//  ну в смысле текст оформите сами...
//  учтите что если по умолчанию вы стоите в конце списка или в середине ... то логично пробежать список вверх
// а потом вниз   


    return(0);
  }
 
 
// прощелкать объекты

// ищем объект по имени 
int FindHendlMessage( int Current  , string findname   )
{

   string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";
  int temp = GetWindow( Current , GW_CHILD ); // ищем
  while ( temp != NULL )
  {
     GetWindowTextA( temp , p1 , StringLen(findname )+1 ); 
     if ( p1 == findname) // проверим а не тот ли это объект ! имя которог омы знаем     {
        return( temp ); // это то что мы ищем
     }
     int r =   FindHendlKey( temp  ,   findname   ) ; // не значит не она , обойдем ее дочерние объекты
     if ( r != NULL )
     {
        return (r); // опс нашли дочку
     }
     temp = GetWindow( temp , GW_HWNDNEXT ); // проверяем следующий объект, дочерний 
  }
  return (0);
}

// тут рекурсия - стек должен быть с запасом

//  вставить в начало - мне хватало 4048
#property stacksize   4048 // внимание это обязательно для рекурсии ( пока не замеченно косяков при стеке 4048

int FindHendlKey( int Current  , string findname   )
{
   string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";
  int temp = GetWindow( Current , GW_CHILD ); // ищем
  while ( temp != NULL )
  {
     GetWindowTextA( temp , p1 , StringLen(findname )+1 ); 
     if ( p1 == findname) // проверим а не  тот ли это объект
     {
        return( temp ); // это то что мы ищем
     }
     int r =   FindHendlKey( temp  ,   findname   ) ; // не значит не она , обойдем ее дочерние объекты
     if ( r != NULL )
     {
        return (r); // опс нашли дочку
     }
     temp = GetWindow( temp , GW_HWNDNEXT ); // проверяем следующий объект, дочерний 
  }
  return (0);
}

 
YuraZ >>:


Спасибо, буду разбираться дальше.

 
HIDDEN >>:

Осталось совсем чуть чуть, решить как говорится пару дел.

Мужики помогайте, заковыристый этот WinAPI не для профи. первый раз с ним работаю.

Код правильный поэтому должен работать. У меня такой код работает без проблем.

При ошибке функция обычно возвращает -1, а не ноль. Может в коде закралась какая-то ошибка.


Как вариант необходимо проверить правильное объявление функции SendMessageA() для поиска строки.

Последний параметр должен быть объявлен строковым. Если её оставить по-умолчанию целым, то компилятор

проглотит код без ошибки, но функция будет работать некорректно.

 
Ilnur >>:

Код правильный поэтому должен работать. У меня такой код работает без проблем.

При ошибке функция обычно возвращает -1, а не ноль. Может в коде закралась какая-то ошибка.


Как вариант необходимо проверить правильное объявление функции SendMessageA() для поиска строки.

Последний параметр должен быть объявлен строковым. Если её оставить по-умолчанию целым, то компилятор

проглотит код без ошибки, но функция будет работать некорректно.

Попробуй у себя в терминале мой код, может у меня терминал или винда с библиотекой корявая.

 

Мой код выбора эксперта идентичный твоему:

hExpertBox = GetDlgItem(hTesterWnd, 0x468);
nPosition = SendMessageA(hExpertBox, CB_FINDSTRING, 0, sExpertName);
SendMessageA(hExpertBox, CB_SETCURSEL, nPosition, 0);

Здесь sExpertName - имя эксперта в виде строки.


Для чистоты эксперимента запустил твой код - все работает.

 
Ilnur >>:

Мой код выбора эксперта идентичный твоему:

Здесь sExpertName - имя эксперта в виде строки.


Для чистоты эксперимента запустил твой код - все работает.

Странное дело какое-то... у меня не работает.

Какой виндовс стоит и какой сервиспак?

 

Посмотрел на компе и в сети файл библиотеки user32.dll существуют куча разных по размеру файлов.

Может быть проблема у меня в том, что библиотека сама кривая.


Ilnur, если не сложно выложи тут свою версию библиотеки, попробую с ней потестировать.

Yuraz, а у тебя получилось найти и подставить имя функции по кодам Ilnurа или моим, если не сложно свою библиотеку тоже выложи.

 
HIDDEN >>:

Посмотрел на компе и в сети файл библиотеки user32.dll существуют куча разных по размеру файлов.

Может быть проблема у меня в том, что библиотека сама кривая.


Ilnur, если не сложно выложи тут свою версию библиотеки, попробую с ней потестировать.

Yuraz, а у тебя получилось найти и подставить имя функции по кодам Ilnurа или моим, если не сложно свою библиотеку тоже выложи.

SP2 XPPRO

Если на машине постоянно и много ставится софты то все что угодно может быть

если ОСЬ целевая - где крутится стабильный проверенный небольшой набор задач либо одна

т е не стоит куча программ не сносится постоянно что то и не ставится масса чего то там

то как правило проблем не бывает

Файлы:
user32.zip  301 kb
Причина обращения: