Bibliotheken: MultiTester - Seite 54

 
hini #:

Der Code prüft nur die Sprachen Russisch und Englisch

Wenn jemand den Namen der Start-Schaltfläche in anderen Sprachen angibt, werde ich ihn in den Quellcode aufnehmen.
 
fxsaber #:
Wenn jemand den Namen der Start-Schaltfläche in anderen Sprachen angibt, werde ich ihn in den Quelltext aufnehmen.
Im Chinesischen lautet der Text der Start- und Stopp-Schaltflächen wie folgt: "开始" und "停止".
 
hini #:
Im Chinesischen lautet der Text der Schaltflächen "Start" und "Stop" wie folgt: "开始" und "停止".
Aktualisiert.
 
fxsaber #:
Aktualisiert.
Vielleicht ist es einfacher, eine Zeichenfolge aus der Schaltfläche zu lesen und dann zu vergleichen, ob sie gleich bleibt oder sich geändert hat? Es gibt eine Menge Sprachen, aber die Schaltfläche hat nur zwei Zustände.
 
Stanislav Korotky #:
Wäre es nicht einfacher, eine Zeichenkette von der Schaltfläche zu lesen und dann zu vergleichen, ob sie gleich bleibt oder sich geändert hat?

Schließlich soll die Funktion nicht von vorherigen Zuständen abhängig sein. Einfacher wäre es, die Farbe zu verwenden: grün - Start, sonst - Stop. Aber ich mache alles in WinAPI per poke-Methode, daher weiß ich nicht, wie ich die Farbe (Grünkomponente) der Schaltfläche auslesen kann. Wenn es eine funktionierende Variante gibt, werde ich sie natürlich ersetzen.

 
fxsaber #:

Dennoch sollte die Funktion nicht von vorherigen Zuständen abhängig sein. Es wäre einfacher, die Farbe zu verwenden: Grün - Start, sonst - Stop. Aber ich mache alles in WinAPI mit der poke-Methode, daher weiß ich nicht, wie ich die Farbe (Grünkomponente) der Schaltfläche auslesen kann. Wenn es eine funktionierende Variante gibt, werde ich sie natürlich ersetzen.

Dieser Code wurde von mir getestet und es wurde bestätigt, dass er funktioniert.

(Ich empfehle, beide Methoden beizubehalten, vielleicht werden die MT5-Entwickler in Zukunft die Farben ändern).

//+------------------------------------------------------------------+
//|CheckButtonColour.mq5|
//+------------------------------------------------------------------+
#include <WinAPI/winapi.mqh>

#define private public
#include <fxsaber/MultiTester/MTTester.mqh>
#undef private

#ifdef __MQL5__
#define  ULONG_PTR   ulong
#else
#define  ULONG_PTR   uint
#endif

#define  WORD           int
#define  DWORD_PTR      ULONG_PTR
#define  BYTE           uchar

#define  LOBYTE(w)           ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define  GetRValue(rgb)      (LOBYTE(rgb))
#define  GetGValue(rgb)      (LOBYTE(((WORD)(rgb)) >> 8))
#define  GetBValue(rgb)      (LOBYTE((rgb)>>16))
//+------------------------------------------------------------------+
//| Handle der "Start"-Taste holen|
//+------------------------------------------------------------------+
long GetStartBtnHandle(void) {
  static const int ControlID[] = {0xE81E, 0x804E, 0x2712, 0x4196};
  static const long Handle = MTTESTER::GetHandle(ControlID);
  if(Handle <= 0) return 0;
  return Handle;
}

//+------------------------------------------------------------------+
//| Generische Farberkennungsfunktion: Prüfen, ob Taste spezifisch ist |
//| Position entspricht der voreingestellten RGB-Farbe |
//+------------------------------------------------------------------+
bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
  if(!hButton || !user32::IsWindow(hButton)) return false;
  // 1. die Position der Schaltfläche auf dem Bildschirm ermitteln
  RECT rect;
  user32::GetWindowRect(hButton, rect);
  // 2. Abtastpunkt: 20 Pixel vom linken Rand, vertikale Mitte (Text vermeiden)
  int targetX = rect.left + 20;
  int targetY = rect.top + (rect.bottom - rect.top) / 2;
  // 3. die Bildschirmabtastung
  HANDLE hdcScreen = user32::GetDC(NULL);
  uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
  user32::ReleaseDC(NULL, hdcScreen);
  if(clr == 0xFFFFFFFF) return false;
  return targetClr == clr;
}
//+------------------------------------------------------------------+
//| Skript-Einstiegspunkt OnStart|
//+------------------------------------------------------------------+
void OnStart() {
  HWND hBtn = (HWND)GetStartBtnHandle();
  if(hBtn == 0) return;
  // Flexible Anrufe auf der Grundlage von Benutzeranforderungen ---
  // Prüfen Sie auf: Helles Thema grün (156, 204, 101) hover:140, 188, 85
  bool isLightGreen = IsButtonBackgroundColor(hBtn, C'156, 204, 101') || 
                      IsButtonBackgroundColor(hBtn, C'140, 188, 85');
  
  // Prüfung auf: Dunkles Thema grün (96, 96, 0) hover:80, 80, 0
  bool isDarkGreen = IsButtonBackgroundColor(hBtn, C'96, 96, 0') || 
                     IsButtonBackgroundColor(hBtn, C'80, 80, 0');
  
  // Prüfen Sie auf: Lichtthema rot (239, 154, 154) hover:223, 138, 138
  bool isLightRed = IsButtonBackgroundColor(hBtn, C'239, 154, 154') || 
                    IsButtonBackgroundColor(hBtn, C'223, 138, 138');
  
  // Prüfung auf: Dunkles Thema rot (112, 14, 19) hover:128, 30, 35
  bool isDarkRed = IsButtonBackgroundColor(hBtn, C'112, 14, 19') || 
                   IsButtonBackgroundColor(hBtn, C'128, 30, 35');
  // Geschäftslogik
  if(isLightGreen || isDarkGreen) {
    Print("Current button state: Green (Ready to start)");
  } else if(isLightRed || isDarkRed) {
    Print("Current button state: Red (Running/Stopped)");
  } else {
    Print("Current button state: Other color/Unknown");
  }
}
//+------------------------------------------------------------------+
 
fxsaber #:

Dennoch sollte die Funktion nicht von vorherigen Zuständen abhängig sein. Es wäre einfacher, die Farbe zu verwenden: Grün - Start, sonst - Stop. Aber ich mache alles in WinAPI mit der poke-Methode, daher weiß ich nicht, wie ich die Farbe (Grünkomponente) der Schaltfläche auslesen kann. Wenn es eine funktionierende Variante gibt, werde ich sie natürlich ersetzen.

Es ist wahrscheinlich einfacher, nicht durch die Farbe der Schaltfläche, sondern durch den Zustand der Inputs-Liste - aktiviert/deaktiviert.
 
Stanislav Korotky #:
Wahrscheinlich ist es einfacher, nicht nach der Farbe der Schaltfläche zu suchen, sondern nach dem Status der Liste Eingänge - aktiviert/deaktiviert.
Woher bekommt man den Status der Eingaben? Es gibt keine offizielle API, wir müssen ihn anhand von Farben und Text bestimmen.
 
hini #:
Wo kann man den Status der Eingaben abfragen? Es gibt keine offizielle API, wir müssen ihn anhand von Farben und Text ermitteln.

Nun, es gibt keine offizielle API für alle MT5-Interna - man muss sie mit Dienstprogrammen wie MS Spy untersuchen - so wurden die Kontrollkennungen gefunden, die jetzt im Multitester verwendet werden.

Wenn Sie sich nicht in die wilde Welt der Inputs begeben und nur die bereits getestete Start-Schaltfläche verwenden, sollte der Aufruf GetWindowLongA(hwnd, 0) die aktuelle Farbe der Schaltfläche zurückgeben. Meiner liefert 0xD0B1DF10 für die grüne Schaltfläche. Nur wenn MQ beschließt, den Stil zu korrigieren, könnte diese Einstellung verschwinden. Daher ist die Überprüfung der Aktivität von Inputs ohnehin zuverlässiger.

 
Stanislav Korotky #:

sieht so aus, als sollte der Aufruf GetWindowLongW(hwnd, 0) die aktuelle Farbe der Schaltfläche zurückgeben. Ich erhalte 0xD0B1DF10 für die grüne Schaltfläche.

GetPixel scheint eine andere G-Farbe zurückzugeben.