带有按钮和鼠标点击拦截的自动化。 - 页 8

 

只剩下几件事要做了,就像他们说的,解决几个案件。

这个WinAPI不适合专业人士使用,这是我第一次使用它。


我卡在两件事上。


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 Scanner程序中做了同样的事情,它返回了该行的编号。


然后我用函数


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,而不是0。也许代码中存在一些错误。


另一种方法是检查SendMessageA()函数的正确声明,搜索一个字符串。

最后一个参数应该被声明为字符串。如果它默认为整数,那么编译器将

将无误地吞下该代码,但该函数将不能正常工作。

 
Ilnur >> :

代码是正确的,所以它应该工作。我的这个代码工作起来没有任何问题。

当发生错误时,该函数通常返回-1,而不是0。也许代码中存在一些错误。


另外,你必须检查SendMessageA()函数的正确声明,以搜索一个字符串。

最后一个参数应该被声明为字符串。如果它默认为整数,那么编译器将

会吞下代码而不出错,但该函数会错误地工作。

在你的终端上试试我的代码,也许我的终端或库被搞坏了。

 

我的专家选择代码与你的相同。

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

这里sExpertName是专家顾问的名字,是一个字符串。


为了实验的纯粹性,我运行了你的代码--一切正常。

 
Ilnur >> :

我的专家选择代码与你的相同。

这里sExpertName是专家顾问的名字,是一个字符串。


为了实验的纯粹性,我运行了你的代码--一切正常。

这是一个奇怪的事情...这对我来说是行不通的。

它是什么Windows,什么服务包?

 

在我的电脑上和网络上看了一下user32.dll库文件,有一堆不同大小的文件

也许我的问题是图书馆本身是歪的。


Ilnur,如果把你的库的版本贴在这里不难的话,我可以试着用它来测试。

Yuraz,你设法通过Ilnur的代码或我的代码找到并替换了函数名称,如果不难,也可以发布你的库。

 
HIDDEN >> :

在我的电脑上和网络上看了一下user32.dll库文件,有一堆不同大小的文件。

也许我的问题是图书馆本身是歪的。


Ilnur,如果你不介意把你的库的版本贴在这里,我可以试着用它来测试。

Yuraz,你发现并替换了Ilnur或我的代码中的函数名称,如果不困难你的库也会暴露。

SP2 XPPRO

如果你的机器上安装了很多软件,任何事情都可能发生。

如果目标操作系统是一个稳定的、经过验证的小型任务集或一个

即很多程序没有被持续运行,很多东西没有被安装。

一般来说,没有问题

附加的文件:
user32.zip  301 kb