Automazione con intercettazione di pulsanti e clic del mouse. - pagina 8

 

Restano solo poche cose da fare, come si dice, per risolvere un paio di casi.

Questa WinAPI non è per professionisti, è la prima volta che ci lavoro.


Sono bloccato su 2 cose.


1. Come posso recuperare il numero di linea per nome dall'Expert Advisor in ComboBox con una lista di Expert Advisors?


Lo faccio così


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

Ottengo zero, ed è tutto. La stessa cosa che faccio nel programma InqSoft Windows Scanner, restituisce il numero della linea.


Poi uso la funzione


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

Tutto funziona come dovrebbe, ma non so come ottenere questo numero 12.


2. questo è un problema di inserimento della data. YuraZ, sembra che tu abbia spiegato, ma non capisco come avvicinarmi a ciò che hai spiegato. Non riesco nemmeno a capire come farlo con un clicker.


Aiutami a finire l'esecuzione dell'ottimizzatore automatico, prometto di inviarmi il codice, poi voglio allegare il parsing di HTML memorizzato e la sostituzione dei risultati nell'Expert Advisor. Nessun problema con quest'ultimo, e il lancio del tester è una spina nel fianco. Ho imparato come mettere le caselle di controllo nei posti richiesti, come cliccare i pulsanti, ma non riesco a padroneggiare il problema che ho descritto.


Dopo il completamento e il test voglio farne un articolo, penso che per molte persone questa funzione sarà utile, anche se non il fatto che gli sviluppatori mancheranno questa informazione.

 
HIDDEN >> :

opzionalmente


non c'è bisogno di contare quante linee ci sono o di preoccuparsi

è sufficiente cercare il nostro esperto "il nostro eroe esperto" nella lista

logicamente, se si fa un contatore, si può anche aumentare il numero dalla lista

basta trovare la parte superiore della lista e correre verso il basso o trovare la parte inferiore e correre verso l'alto

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


Grazie, indagherò ulteriormente.

 
HIDDEN >> :

Restano solo poche cose da fare, come si dice, per risolvere un paio di casi.

Aiutatemi ragazzi, questa WinAPI è complicata, non è per i professionisti, è la prima volta che ci lavoro.

Il codice è corretto, quindi dovrebbe funzionare. Ho questo codice funziona senza problemi.

Quando si verifica un errore, la funzione di solito restituisce -1, non zero. Forse c'è qualche errore nel codice.


Un altro modo è controllare la corretta dichiarazione della funzione SendMessageA() per cercare una stringa.

L'ultimo parametro dovrebbe essere dichiarato come stringa. Se è lasciato intero di default il compilatore

ingoierà il codice senza errori, ma la funzione non funzionerà correttamente.

 
Ilnur >> :

Il codice è corretto, quindi dovrebbe funzionare. Ho questo codice funziona senza problemi.

Quando si verifica un errore, la funzione di solito restituisce -1, non zero. Forse c'è qualche errore nel codice.


In alternativa, dovete controllare la corretta dichiarazione della funzione SendMessageA() per cercare una stringa.

L'ultimo parametro dovrebbe essere dichiarato come stringa. Se è lasciato intero di default il compilatore

inghiottirà il codice senza errori, ma la funzione funzionerà in modo errato.

Provate il mio codice nel vostro terminale, forse il mio terminale o la libreria sono incasinati.

 

Il mio codice di selezione degli esperti è identico al tuo:

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

Qui sExpertName è il nome dell'Expert Advisor come stringa.


Per amore della purezza dell'esperimento, ho eseguito il tuo codice - tutto funziona.

 
Ilnur >> :

Il mio codice di selezione degli esperti è identico al tuo:

Qui sExpertName è il nome dell'Expert Advisor come stringa.


Per amore della purezza dell'esperimento, ho eseguito il tuo codice - tutto funziona.

È una cosa strana... non funziona per me.

Che Windows è e quale service pack?

 

Ho guardato il file di libreria user32.dll sul mio computer e in rete e ci sono un sacco di file di dimensioni diverse.

Forse il mio problema è che la biblioteca stessa è storta.


Ilnur, se non è difficile postare qui la tua versione della libreria, proverò a testarla.

Yuraz, e sei riuscito a trovare e sostituire il nome della funzione con i codici di Ilnur o i miei, se non è difficile postare anche la tua libreria.

 
HIDDEN >> :

Ho guardato il file di libreria user32.dll sul mio computer e in rete e ci sono un sacco di file di dimensioni diverse.

Forse il mio problema è che la biblioteca stessa è storta.


Ilnur, se non ti dispiace postare qui la tua versione della libreria, proverò a testarla.

Yuraz, e hai trovato e sostituire il nome della funzione nei codici Ilnur o il mio, se non è difficile mettere la loro libreria troppo.

SP2 XPPRO

Se avete molti software installati sulla vostra macchina, può succedere di tutto.

se il sistema operativo di destinazione è un piccolo insieme stabile e collaudato di compiti o uno

cioè molti programmi non vengono eseguiti costantemente e molte cose non vengono installate

di regola non c'è nessun problema

File:
user32.zip  301 kb
Motivazione: