Automatización con interceptación de botones y clics del ratón. - página 8

 

Sólo queda por hacer, como se dice, resolver un par de casos.

Esta WinAPI no es para profesionales, es la primera vez que trabajo con ella.


Estoy atascado en 2 cosas.


1. ¿Cómo puedo recuperar el número de línea por nombre desde el ComboBox de Asesores Expertos donde se muestra la lista de Asesores Expertos?


Lo hago así


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

Me sale cero, y ya está. Lo mismo hago en el programa InqSoft Windows Scanner, devuelve el número de la línea.


Entonces utilizo la función


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

Todo funciona como debería, pero no sé cómo conseguir este número 12.


2. se trata de un problema de inserción de la fecha. YuraZ, parece que te has explicado, pero no entiendo cómo enfocar lo que has explicado. Tampoco sé cómo hacerlo con un clicker.


Ayúdame a terminar de ejecutar el optimizador automatizado, prometo enviarme el código, luego quiero adjuntar el análisis sintáctico del HTML almacenado y la sustitución de los resultados en el Asesor Experto. No hay problemas con esto último, y el lanzamiento del probador es un dolor de cabeza. He aprendido cómo colocar las casillas de verificación en los lugares requeridos, cómo hacer clic en los botones, pero no puedo dominar el problema descrito anteriormente.


Después de la finalización y las pruebas quiero convertirlo en un artículo, creo que para muchas personas esta característica será útil, aunque no el hecho de que los desarrolladores se pierda esta información.

 
HIDDEN >> :

opcionalmente


no es necesario contar cuántas líneas hay ni molestarse

basta con buscar a nuestro experto "nuestro héroe experto" en la lista

lógicamente, si haces un contador, también puedes subir el número de la lista

Sólo tienes que encontrar la parte superior de la lista y correr hacia abajo o encontrar la parte inferior y correr hacia arriba

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


Gracias, lo investigaré más a fondo.

 
HIDDEN >> :

Sólo queda por hacer, como se dice, resolver un par de casos.

Ayuda chicos, esta WinAPI no es para profesionales, es la primera vez que trabajo con ella.

El código es correcto, así que debería funcionar. Tengo este código funciona sin problemas.

Cuando se produce un error, la función suele devolver -1, no cero. Tal vez haya algún error en el código.


Otra forma es comprobar la declaración correcta de la función SendMessageA() para buscar una cadena.

El último parámetro debe ser declarado como cadena. Si se deja entero por defecto el compilador

se tragará el código sin error, pero la función no funcionará correctamente.

 
Ilnur >> :

El código es correcto, así que debería funcionar. Tengo este código funciona sin problemas.

Cuando se produce un error, la función suele devolver -1, no cero. Tal vez haya algún error en el código.


También debe comprobar la declaración correcta de la función SendMessageA() para buscar una cadena.

El último parámetro debe declararse como cadena. Si se deja entero por defecto el compilador

se tragará el código sin error pero la función funcionará incorrectamente.

Prueba mi código en tu terminal, tal vez mi terminal o la librería estén fastidiados.

 

Mi código de selección de expertos es idéntico al tuyo:

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

Aquí sExpertName es el nombre del Asesor Experto como una cadena.


En aras de la pureza del experimento, he ejecutado su código - todo funciona.

 
Ilnur >> :

Mi código de selección de expertos es idéntico al tuyo:

Aquí sExpertName es el nombre del Asesor Experto como una cadena.


En aras de la pureza del experimento, he ejecutado su código - todo funciona.

Es una cosa extraña... no me funciona.

¿Qué Windows es y qué Service Pack?

 

He mirado el archivo de la biblioteca user32.dll en mi ordenador y en la red y hay un montón de archivos de diferentes tamaños.

Quizás mi problema es que la propia biblioteca está torcida.


Ilnur, si no es difícil publicar aquí tu versión de la biblioteca, intentaré hacer pruebas con ella.

Yuraz, y se las arregló para encontrar y reemplazar el nombre de la función por los códigos de Ilnur o la mía, si no es difícil de publicar su biblioteca también.

 
HIDDEN >> :

He mirado el archivo de la biblioteca user32.dll en mi ordenador y en la red y hay un montón de archivos de diferentes tamaños.

Quizás mi problema es que la propia biblioteca está torcida.


Ilnur, si no te importa publicar aquí tu versión de la biblioteca, intentaré hacer pruebas con ella.

Yuraz, y que fueron capaces de encontrar y reemplazar el nombre de la función en el código Ilnur o la mía, si no es difícil a su biblioteca también exponer.

SP2 XPPRO

Si tienes muchos programas instalados en tu máquina, puede pasar cualquier cosa.

si el sistema operativo de destino es un conjunto de tareas pequeño, estable y probado o uno

es decir, no se ejecutan constantemente muchos programas y no se instalan muchas cosas

por regla general no hay ningún problema

Archivos adjuntos:
user32.zip  301 kb
Razón de la queja: