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

 
DKeN:

Pouvez-vous me dire comment attraper la fenêtre appelée par F9 (Ordre) ?

Je ne peux pas le trouver par texto.

Jusqu'à présent, il a été pris comme suit :

Cette méthode ne me semble pas du tout fiable. Essayez d'ouvrir une autre fenêtre lorsque la fenêtre d'ordre est ouverte, par exemple les propriétés du graphique, les paramètres du terminal, les variables globales, etc. Quelle fenêtre le GetLastActivePopup vous montrera-t-il ?
 

Bonjour !

Pouvez-vous me dire comment déterminer le descripteur MT d'un EA exécuté dans le testeur ?

La construction :

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
ne fonctionne pas, car
WindowHandle(Symbol(),Period())

Retourne 0.

 

Un tel graphique est-il ouvert à ce stade ? (avec le symbole et la période spécifiés)

 
Meat:

Un tel graphique est-il ouvert à ce stade ? (avec le symbole et la période spécifiés)

Oui, bien sûr.

J'ai essayé les deux façons.

Ou est-ce une fonctionnalité de la fonction WindowHandle (bien qu'il n'y ait aucun mot à ce sujet dans l'aide...).

Ou peut-être que je suis stupide...

 
lasso:

Oui, bien sûr.

J'ai essayé les deux façons.

Ou c'est une particularité de la fonction WindowHandle (bien que l'aide ne le mentionne pas...).

Ou peut-être que je suis stupide...

En mode visualisation, la poignée fonctionne sans problème. Et vous ne testez probablement PAS en mode visuel. Alors c'est logique : pas de fenêtre, pas de poignée. Quant aux autres fenêtres ouvertes, si je comprends bien, elles ne sont pas accessibles depuis le testeur.
Dans ce cas, la seule solution consiste à rechercher une fenêtre Metatrader dans la liste de toutes les fenêtres à l'aide de FindWindowExA(...).
 
Meat:

En mode visualisation, la poignée est obtenue sans problème. Mais vous devez faire des tests PAS en mode visuel. Alors c'est logique : pas de fenêtre, pas de poignée. Quant aux autres fenêtres ouvertes, je comprends qu'elles ne sont pas accessibles depuis le testeur.
Dans ce cas, la seule solution consiste à rechercher la fenêtre requise dans la liste de toutes les fenêtres en utilisant FindWindowExA(...).

Oui, j'ai essayé d'appliquer le code d'Ilnur de la page 5:


Ilnur:

Voici un exemple de script qui lance un testeur de stratégie et attend qu'il se termine. Le texte du bouton est lu avec GetWindowTextA().

Il est intéressant de noter que la fenêtre du testeur ne doit pas nécessairement être visible dans ce cas.

Mais d'après le testeur, cette astuce n'a pas fonctionné. (Je lance un autre terminal pour l'optimisation du testeur et je veux suivre l'achèvement de ce processus).

Si ce n'est pas trop difficile, pouvez-vous me donner un exemple pour FindWindowExA(...) ou un lien ?

 

Ici, j'ai une telle fonction pour trouver une fenêtre :

#import "user32.dll"
  int FindWindowExA(int hwndParent,int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId(int hWnd,int lpdwProcessId);
  int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string textbuf="АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя";

int FindWindow(string class, string caption, bool captionexactly=false)
{    
  //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
  string null_string;
  int h=0;
  while(true)
  {    
    if (captionexactly)
      h=FindWindowExA(0,h,class,caption);
     else
      h=FindWindowExA(0,h,class,null_string);
    if (h==0) return(0);
    //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
    if (captionexactly) return(h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue;
    if (StringSubstr(textbuf,0,len)==caption) return(h);  
  }
  return(0);
}
 

Recherchez le nom de la classe et le titre de la fenêtre requise dans SPY++.

J'ai commenté la vérification de l'ID du fil car elle n'est pas nécessaire dans ce cas (il n'y a pas de fenêtre source à comparer).

En général, je vous conseille de gérer les fonctions WinAPI, si vous comptez les utiliser. Veuillez vous référer au MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx) pour une description détaillée des fonctions.

 
cm=GetDlgItem(hdlg,ID_SYMBOL) ;
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//obtient le numéro dans la liste
//trouver la paire
string fs=" ;
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs) ;
Print(ll," ",fs) ;
}

Veuillez m'indiquer comment obtenir correctement une liste d'outils dans la fenêtre d'ordre (F9) ?

J'obtiens le nombre d'éléments, mais je n'arrive pas à obtenir exactement les rangées par numéro, cela renvoie -1.

#define ID_SYMBOL 0x053E //nom du caractère à sélectionner

cmhandle ComboBox


 
Meat:

Ici, j'ai une telle fonction pour la recherche de fenêtres :


Alexey, merci, la fonction fonctionne, mais...
Laviande:

J'ai commenté la vérification de l'ID du flux car elle n'est pas nécessaire dans ce cas (nous n'avons pas de fenêtre source à comparer).


Je n'ai besoin que de l'identifiant du fil, car j'ai deux terminaux concernés.

Je m'en suis sorti grâce à l'identification du collecteur, mais j'aimerais quand même savoir comment déterminer l'identification du flux sous le testeur ?

Raison: