Automatisation avec interception des boutons et des clics de souris. - page 8

 

Il ne reste que peu de choses à faire, comme on dit, résoudre quelques affaires.

Cette WinAPI n'est pas pour les pros. C'est la première fois que je travaille avec elle.


Je suis bloqué sur 2 choses.


1. Comment puis-je récupérer le numéro de ligne par nom de l'Expert Advisor dans une ComboBox avec une liste d'Expert Advisors?


Je le fais comme ça


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

Je reçois zéro, et c'est tout. Je fais la même chose dans le programme InqSoft Windows Scanner, qui renvoie le numéro de la ligne.


Ensuite, j'utilise la fonction


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

Tout fonctionne comme il se doit, mais je ne sais pas comment obtenir ce numéro 12.


2. Il s'agit d'un problème d'insertion de la date. YuraZ, vous semblez avoir expliqué, mais je ne comprends pas comment aborder ce que vous avez expliqué. Je n'arrive pas non plus à comprendre comment le faire avec un clicker.


Aidez-moi à terminer l'exécution de l'optimiseur automatique, je promets de m'envoyer le code, puis je veux joindre l'analyse du HTML stocké et la substitution des résultats dans le conseiller expert. Pas de problème avec ce dernier, et le lancement du testeur est un casse-tête. J'ai appris à placer des cases à cocher aux endroits requis, à cliquer sur des boutons, mais je ne parviens pas à maîtriser le problème que je viens de décrire.


Après l'achèvement et les tests, je veux en faire un article, je pense que pour beaucoup de gens cette fonctionnalité sera utile, mais pas le fait que les développeurs vont manquer cette information.

 
HIDDEN >> :

éventuellement


il n'est pas nécessaire de compter combien de lignes il y a ou de se donner la peine

il suffit de rechercher notre expert "notre expert héros" dans la liste

logiquement, si vous faites un compteur, vous pouvez aussi élever le nombre de la liste

Il suffit de trouver le haut de la liste et de courir vers le bas ou de trouver le bas et de courir vers le haut.

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


Merci, je vais étudier la question de plus près.

 
HIDDEN >> :

Il ne reste que peu de choses à faire, comme on dit, résoudre quelques affaires.

Aidez-moi les gars, cette WinAPI est délicate, pas pour les pros. C'est la première fois que je travaille avec elle.

Le code est correct, donc cela devrait fonctionner. J'ai ce code qui fonctionne sans aucun problème.

Lorsqu'une erreur se produit, la fonction renvoie généralement -1, et non zéro. Il y a peut-être une erreur dans le code.


Une autre méthode consiste à vérifier la déclaration correcte de la fonction SendMessageA() pour rechercher une chaîne de caractères.

Le dernier paramètre doit être déclaré comme une chaîne de caractères. S'il est laissé entier par défaut, le compilateur

avalera le code sans erreur, mais la fonction ne fonctionnera pas correctement.

 
Ilnur >> :

Le code est correct, donc cela devrait fonctionner. J'ai ce code qui fonctionne sans aucun problème.

Lorsqu'une erreur se produit, la fonction renvoie généralement -1, et non zéro. Il y a peut-être une erreur dans le code.


Sinon, vous devez vérifier la déclaration correcte de la fonction SendMessageA() pour rechercher une chaîne de caractères.

Le dernier paramètre doit être déclaré comme une chaîne de caractères. S'il est laissé entier par défaut, le compilateur

avalera le code sans erreur mais la fonction fonctionnera de manière incorrecte.

Essayez mon code dans votre terminal, peut-être que mon terminal ou la bibliothèque est défectueux.

 

Mon code de sélection des experts est identique au vôtre :

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

Ici, sExpertName est le nom du conseiller expert sous forme de chaîne.


Pour la pureté de l'expérience, j'ai exécuté votre code - tout fonctionne.

 
Ilnur >> :

Mon code de sélection des experts est identique au vôtre :

Ici, sExpertName est le nom du conseiller expert sous forme de chaîne.


Pour la pureté de l'expérience, j'ai exécuté votre code - tout fonctionne.

C'est une chose étrange... ça ne marche pas pour moi.

De quel Windows s'agit-il et quel service pack ?

 

J'ai regardé le fichier de la bibliothèque user32.dll sur mon ordinateur et sur le net et il y a un tas de fichiers de tailles différentes.

Peut-être que mon problème est que la bibliothèque elle-même est tordue.


Ilnur, si ce n'est pas difficile de poster votre version de la bibliothèque ici, je vais essayer de la tester avec.

Yuraz, et vous avez réussi à trouver et remplacer le nom de la fonction par les codes d'Ilnur ou les miens, si ce n'est pas difficile de poster votre bibliothèque aussi.

 
HIDDEN >> :

J'ai regardé le fichier de la bibliothèque user32.dll sur mon ordinateur et sur le net et il y a un tas de fichiers de tailles différentes.

Peut-être que mon problème est que la bibliothèque elle-même est tordue.


Ilnur, si vous voulez bien poster votre version de la bibliothèque ici, je vais essayer de la tester.

Yuraz, et vous avez trouvé et substituer le nom de la fonction dans les codes Ilnur ou la mienne, si pas difficile de placer leur bibliothèque aussi.

SP2 XPPRO

Si vous avez beaucoup de logiciels installés sur votre machine, tout peut arriver.

si le système d'exploitation cible est soit un petit ensemble de tâches stable et éprouvé, soit une

c'est-à-dire que beaucoup de programmes ne sont pas exécutés en permanence et que beaucoup de choses ne sont pas installées.

en règle générale, il n'y a pas de problème

Dossiers :
user32.zip  301 kb