Automação com interceptação por botão e clique do mouse. - página 8

 

Restam apenas algumas coisas a fazer, como se costuma dizer, resolver alguns casos.

Este WinAPI não é para profissionais. Esta é a primeira vez que trabalho com ele.


Estou preso a duas coisas.


1. Como posso recuperar o número da linha pelo nome do Expert Advisor ComboBox onde a lista de Expert Advisors é exibida?


Eu o faço assim


#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);

Eu recebo zero, e pronto. A mesma coisa que eu faço no programa InqSoft Windows Scanner, ele retorna o número da linha.


Então eu uso a função


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

Tudo funciona como deveria, mas eu não sei como conseguir este número 12.


2. este é um problema com a inserção da data. YuraZ, você parece ter explicado, mas eu não entendo como abordar o que você explicou. Também não consigo descobrir como fazer isso com um clicker.


Ajude-me a terminar de executar o otimizador automático, prometo enviar-me o código, depois quero anexar a análise do HTML armazenado e a substituição dos resultados no Expert Advisor. Não há problemas com este último, e o lançamento do testador é uma dor de cabeça. Aprendi como colocar caixas de seleção em lugares obrigatórios, como clicar nos botões, mas não consigo dominar o que descrevi.


Após a conclusão e os testes, quero transformá-lo em um artigo, acho que para muitas pessoas este recurso será útil, embora não seja o fato de que os desenvolvedores não vão sentir falta desta informação.

 
HIDDEN >> :

opcionalmente


não há necessidade de contar quantas linhas existem ou então se preocupar

basta procurar por nosso especialista "nosso herói especialista" na lista

logicamente, se você fizer um contador, você também pode aumentar o número da lista

basta encontrar o topo da lista e correr para baixo ou encontrar o fundo e correr para cima

//+------------------------------------------------------------------+
//|                                                                  |
//|                                           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 >> :


Obrigado, vou investigar mais a fundo.

 
HIDDEN >> :

Restam apenas algumas coisas a fazer, como se costuma dizer, resolver alguns casos.

Ajude rapazes, esta WinAPI é complicada, não para os profissionais.

O código está correto, portanto deve funcionar. Tenho este código que funciona sem problemas.

Quando ocorre um erro, a função geralmente retorna -1, e não zero. Talvez haja algum erro no código.


Outra maneira é verificar a declaração correta da função SendMessageA() para procurar uma cadeia.

O último parâmetro deve ser declarado como string. Se for deixado inteiro por padrão, o compilador

irá engolir o código sem erro, mas a função não funcionará corretamente.

 
Ilnur >> :

O código está correto, portanto deve funcionar. Tenho este código que funciona sem problemas.

Quando ocorre um erro, a função geralmente retorna -1, e não zero. Talvez haja algum erro no código.


Alternativamente, você deve verificar a declaração correta da função SendMessageA() para procurar por uma cadeia.

O último parâmetro deve ser declarado como string. Se for deixado inteiro por padrão, o compilador

irá engolir o código sem erros, mas a função funcionará incorretamente.

Tente meu código em seu terminal, talvez meu terminal ou a biblioteca não esteja funcionando corretamente.

 

Meu código para selecionar um especialista é idêntico ao seu:

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

Aqui sExpertName é o nome do Expert Advisor como uma seqüência.


Para o bem da pureza da experiência, eu fiz o seu código - tudo funciona.

 
Ilnur >> :

Meu código de seleção de especialistas é idêntico ao seu:

Aqui sExpertName é o nome do Expert Advisor como uma seqüência.


Para o bem da pureza da experiência, eu fiz o seu código - tudo funciona.

É uma coisa estranha... não está funcionando para mim.

Que Windows é este e que pacote de serviços?

 

Olhei o arquivo da biblioteca user32.dll no meu computador e na rede e há um monte de arquivos de tamanhos diferentes.

Talvez o meu problema seja que a própria biblioteca esteja torta.


Ilnur, se não for difícil publicar aqui sua versão da biblioteca, tentarei testá-la com ela.

Yuraz, e você conseguiu encontrar e substituir o nome da função pelos códigos da Ilnur ou meus, se não for difícil postar sua biblioteca também.

 
HIDDEN >> :

Olhei o arquivo da biblioteca user32.dll no meu computador e na rede e há um monte de arquivos de tamanhos diferentes.

Talvez o meu problema seja que a própria biblioteca esteja torta.


Ilnur, se você não se importa de colocar aqui sua versão da biblioteca, tentarei testá-la com ela.

Yuraz, e você encontrou e substituiu o nome da função nos códigos Ilnur ou meu, se não for difícil colocar sua biblioteca também.

SP2 XPPRO

Se você tiver muito software instalado em sua máquina, tudo pode acontecer.

se o SO alvo for um conjunto estável e comprovadamente pequeno de tarefas ou um

ou seja, muitos programas não estão sendo executados constantemente e muitas coisas não estão sendo instaladas

como regra não há problema

Arquivos anexados:
user32.zip  301 kb
Razão: