Automatisierung mit Abfangen von Tasten und Mausklicks. - Seite 10

 
DKeN:

Können Sie mir sagen, wie ich das mit F9 (Auftrag) aufgerufene Fenster abfangen kann?

Ich kann sie nicht per Text finden.

Bislang wurde sie wie folgt gefangen:

Das scheint mir überhaupt kein zuverlässiger Weg zu sein. Versuchen Sie, ein anderes Fenster zu öffnen, wenn das Auftragsfenster geöffnet ist, z. B. die Diagrammeigenschaften, die Terminaleinstellungen oder die globalen Variablen usw. Welches Fenster zeigt Ihnen GetLastActivePopup?
 

Hallo!

Können Sie mir sagen, wie ich den MT-Deskriptor von einem im Tester laufenden EA ermitteln kann?

Das Konstrukt:

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

Gibt 0 zurück.

 

Ist ein solches Diagramm an dieser Stelle offen? (mit dem angegebenen Symbol und Punkt)

 
Meat:

Ist ein solches Diagramm an dieser Stelle offen? (mit angegebenem Symbol und Punkt)

Ja, natürlich.

Ich habe es auf beide Arten versucht.

Oder ist es ein Merkmal der Funktion WindowHandle (obwohl in der Hilfe kein Wort darüber steht...)

Oder vielleicht bin ich dumm...

 
lasso:

Ja, natürlich.

Ich habe es auf beide Arten versucht.

Oder es ist eine Besonderheit der WindowHandle-Funktion (obwohl die Hilfe dies nicht erwähnt...).

Oder vielleicht bin ich dumm...

Im Visualisierungsmodus funktioniert der Griff ohne Probleme. Und Sie testen wahrscheinlich NICHT im visuellen Modus. Dann macht es Sinn: kein Fenster, kein Griff. Was die anderen geöffneten Fenster betrifft, so sind sie meines Wissens nach vom Tester aus nicht zugänglich.
In diesem Fall besteht der einzige Ausweg darin, in der Liste aller Fenster mit FindWindowExA(...) nach einem Metatrader-Fenster zu suchen.
 
Meat:

Im Visualisierungsmodus wird der Griff ohne Probleme erhalten. Aber Sie müssen NICHT im visuellen Modus testen. Dann macht es Sinn: kein Fenster, kein Griff. Was die anderen geöffneten Fenster betrifft, so verstehe ich, dass sie vom Prüfgerät aus nicht zugänglich sind.
In diesem Fall besteht der einzige Ausweg darin, in der Liste aller Fenster mit FindWindowExA(...) nach dem gewünschten Fenster zu suchen.

Ja, ich habe versucht, den Code von Ilnur von Seite 5 anzuwenden:


Ilnur:

Hier ein Beispiel für ein Skript, das einen Strategietester startet und wartet, bis er fertig ist. Der Text der Schaltfläche wird mit GetWindowTextA() gelesen.

Interessanterweise muss das Prüferfenster in diesem Fall nicht unbedingt sichtbar sein.

Aber bei den Testern hat dieser Trick nicht funktioniert. (Ich starte ein weiteres Terminal für die Optimierung vom Tester und möchte den Abschluss dieses Prozesses verfolgen).

Wenn es nicht zu schwierig ist, können Sie mir ein Beispiel für FindWindowExA(...) oder einen Link geben?

 

Hier habe ich eine solche Funktion zum Finden eines Fensters:

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

Schlagen Sie den Klassennamen und den Titel des gewünschten Fensters in SPY++ nach.

Ich habe die Prüfung der Thread-ID auskommentiert, weil sie in diesem Fall nicht benötigt wird (es gibt kein Quellfenster zum Vergleichen).

Im Allgemeinen rate ich Ihnen, WinAPI-Funktionen zu verwenden, wenn Sie sie benutzen wollen. Eine detaillierte Beschreibung der Funktionen finden Sie im MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx).

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//Nummer in der Liste ermitteln
//das Paar finden
string fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Print(ll," ",fs);
}

Wie bekomme ich eine Liste der Werkzeuge im Auftragsfenster (F9)?

Ich erhalte die Anzahl der Elemente, kann aber nicht genau die Zeilen nach Anzahl erhalten, sondern gebe -1 zurück.

#define ID_SYMBOL 0x053E //Zeichenname zur Auswahl

cmhandle ComboBox


 
Meat:

Hier habe ich eine solche Funktion für die Fenstersuche:


Alexey, danke, die Funktion funktioniert, aber...
Fleisch:

Ich habe die Prüfung der Fluss-ID auskommentiert, weil sie in diesem Fall nicht benötigt wird (wir haben kein Quellfenster zum Vergleichen).


Es wird nur die Gewinde-ID benötigt, da ich zwei Terminals habe.

Ich bin durch die Identifizierung des Kopfes aus der Sache herausgekommen, aber ich würde immer noch gerne wissen, wie man die Durchfluss-ID unter dem Prüfgerät bestimmt?

Grund der Beschwerde: