Automatisierung mit Abfangen von Tasten und Mausklicks. - Seite 8

 

Es gibt nur noch ein paar Dinge zu tun, wie man sagt, ein paar Fälle zu lösen.

Diese WinAPI ist nichts für Profis, ich arbeite zum ersten Mal damit.


Ich hänge bei 2 Dingen fest.


1. Wie kann ich in einer ComboBox mit einer Liste von Expert Advisors die Zeilennummer nach Name des Expert Advisors abrufen?


Ich mache es folgendermaßen


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

Ich bekomme null, und das war's. Dasselbe mache ich mit dem Programm InqSoft Windows Scanner, es gibt die Nummer der Zeile zurück.


Dann verwende ich die Funktion


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

Alles funktioniert wie es soll, aber ich weiß nicht, wie ich die Nummer 12 bekomme.


2. Dies ist ein Problem beim Einfügen des Datums. YuraZ, du scheinst es erklärt zu haben, aber ich verstehe nicht, wie ich das, was du erklärt hast, angehen soll. Ich kann auch nicht herausfinden, wie man es mit einem Clicker macht.


Helfen Sie mir fertig laufen automatisierte Optimierer, ich verspreche, mir den Code zu senden, dann möchte ich Parsing von gespeicherten HTML und Ersetzung der Ergebnisse in der Expert Advisor befestigen. Bei letzterem gibt es keine Probleme, und der Start des Prüfgeräts ist mühsam. Ich habe gelernt, wie man Kontrollkästchen an den gewünschten Stellen platziert und wie man auf Schaltflächen klickt, aber ich kann das von mir beschriebene Problem nicht lösen.


Nach der Fertigstellung und dem Testen möchte ich daraus einen Artikel machen, ich denke, dass diese Funktion für viele Leute nützlich sein wird, auch wenn die Entwickler diese Informationen nicht vermissen werden.

 
HIDDEN >> :

wahlweise


es ist nicht nötig, die Anzahl der Zeilen zu zählen oder sich die Mühe zu machen

es genügt, in der Liste nach unserem Experten "our hero expert" zu suchen

Wenn Sie einen Zähler erstellen, können Sie logischerweise auch die Zahl in der Liste erhöhen.

Suchen Sie einfach den Anfang der Liste und laufen Sie nach unten oder suchen Sie das Ende und laufen Sie nach oben

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


Danke, ich werde mich weiter damit befassen.

 
HIDDEN >> :

Es gibt nur noch ein paar Dinge zu tun, wie man sagt, ein paar Fälle zu lösen.

Helft mir, diese WinAPI ist kompliziert, nichts für Profis. Ich arbeite zum ersten Mal damit.

Der Code ist korrekt, also sollte es funktionieren. Ich habe diesen Code funktioniert ohne Probleme.

Wenn ein Fehler auftritt, gibt die Funktion in der Regel -1 und nicht Null zurück. Vielleicht gibt es einen Fehler im Code.


Eine andere Möglichkeit besteht darin, die korrekte Deklaration der Funktion SendMessageA() zu überprüfen, um nach einer Zeichenfolge zu suchen.

Der letzte Parameter sollte als String deklariert werden. Wenn es standardmäßig ganzzahlig gelassen wird, wird der Compiler

wird den Code ohne Fehler schlucken, aber die Funktion wird nicht korrekt funktionieren.

 
Ilnur >> :

Der Code ist korrekt, also sollte es funktionieren. Ich habe diesen Code funktioniert ohne Probleme.

Wenn ein Fehler auftritt, gibt die Funktion in der Regel -1 und nicht Null zurück. Vielleicht gibt es einen Fehler im Code.


Alternativ dazu müssen Sie die korrekte Deklaration der Funktion SendMessageA() überprüfen, um nach einer Zeichenkette zu suchen.

Der letzte Parameter sollte als String deklariert werden. Wenn es standardmäßig ganzzahlig gelassen wird, wird der Compiler

wird den Code ohne Fehler verschlucken, aber die Funktion wird nicht richtig funktionieren.

Probieren Sie meinen Code in Ihrem Terminal aus, vielleicht ist mein Terminal oder die Bibliothek defekt.

 

Mein Code für die Expertenauswahl ist mit dem Ihren identisch:

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

Dabei ist sExpertName der Name des Expert Advisors als String.


Um der Reinheit des Experiments willen habe ich Ihren Code ausgeführt - alles funktioniert.

 
Ilnur >> :

Mein Code für die Expertenauswahl ist mit dem Ihren identisch:

Hier ist sExpertName der Name des Expert Advisors als String.


Um der Reinheit des Experiments willen habe ich Ihren Code ausgeführt - alles funktioniert.

Es ist eine seltsame Sache... Bei mir funktioniert es nicht.

Um welches Windows handelt es sich und welches Service Pack?

 

Ich habe mir die Bibliotheksdatei user32.dll auf meinem Computer und im Internet angesehen, und es gibt eine ganze Reihe von Dateien unterschiedlicher Größe.

Vielleicht ist mein Problem, dass die Bibliothek selbst schief ist.


Ilnur, wenn es nicht schwer ist, Ihre Version der Bibliothek hier zu posten, werde ich versuchen, mit ihr zu testen.

Yuraz, und Sie verwaltet zu finden und ersetzen Sie den Namen der Funktion durch Ilnur's Codes oder meine, wenn nicht schwer, Ihre Bibliothek zu posten.

 
HIDDEN >> :

Ich habe mir die Bibliotheksdatei user32.dll auf meinem Computer und im Internet angesehen, und es gibt eine ganze Reihe von Dateien unterschiedlicher Größe.

Vielleicht liegt mein Problem darin, dass die Bibliothek selbst schief ist.


Ilnur, wenn es dir nichts ausmacht, deine Version der Bibliothek hier zu posten, werde ich versuchen, sie zu testen.

Yuraz, und Sie gefunden und ersetzen Sie den Namen der Funktion in den Codes Ilnur oder meine, wenn nicht schwierig, ihre Bibliothek zu platzieren.

SP2 XPPRO

Wenn Sie eine Menge Software auf Ihrem Computer installiert haben, kann alles passieren.

wenn das Zielbetriebssystem entweder eine stabile, bewährte kleine Gruppe von Aufgaben ist oder eine

d.h. viele Programme werden nicht ständig ausgeführt und viele Dinge werden nicht installiert

In der Regel gibt es kein Problem

Dateien:
user32.zip  301 kb
Grund der Beschwerde: